对象复制
关于php对象的复制方式。
才疏学浅,只知道以下几种!
- $a = new A();
- $a = $b;
- KaTeX parse error: Expected 'EOF', got '&' at position 5: a = &̲b;
那么这三种方式指向的内存是否为同一块呢?
<?php
class user
{
public $name = 'zs';
public function __clone()
{
echo 'clone over';
echo '<hr>';
}
}
$a = new user();
$b = $a;
$c = &$a;
$b->name = 'ls';
echo $a->name;
echo '<br>';
echo $b->name;
echo '<br>';
echo $c->name;
输出结果
ls
ls
ls
?>
得出第一个结论、这三种方式指向的是同一个地址!
再看克隆对象!
<?php
/*克隆对象*/
class user
{
public $name = 'zs';
public function __clone()
{
echo 'clone over';
echo '<hr>';
}
}
$a = new user();
$d = $a;
$c = &$a;
$b = clone $a;
$d->name = 'ls';
echo $a->name;
echo '<br>';
echo $b->name;
echo '<br>';
echo $c->name;
echo '<br>';
echo $d->name;
输出结果
ls
zs
ls
ls
得出第二个结论,clone是单独指向一块空间的
综上
在PHP5的类对象操作中,
a
=
a=
a=b和KaTeX parse error: Expected 'EOF', got '&' at position 3: a=&̲b这种赋值方式,指向的是同一个对象,同一块内存空间。
$a=clone $b这种赋值方式,则是指向另一个新的对象,另一个块新的内存空间。
Final
PHP 5新增的关键字final
-
不能修饰成员属性
-
父类中的方法被 final 修饰后,则不能在子类中覆盖
<?php
class BaseClass {
public function test() {
echo "BaseClass::test() called\n";
}
final public function moreTesting() {
echo "BaseClass::moreTesting() called\n";
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called\n";
}
}
// Results in Fatal error: Cannot override final method BaseClass::moreTesting()
?>
- 一个类被 final 修饰后,则不能被继承
<?php
final class BaseClass {
public function test() {
echo "BaseClass::test() called\n";
}
// 这里无论你是否将方法声明为final,都没有关系
final public function moreTesting() {
echo "BaseClass::moreTesting() called\n";
}
}
class ChildClass extends BaseClass {
}
// 产生 Fatal error: Class ChildClass may not inherit from final class (BaseClass)
?>