搬砖笔记:PHP对象机制

文章目录

对象复制

关于php对象的复制方式。

才疏学浅,只知道以下几种!

  1. $a = new A();
  2. $a = $b;
  3. 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

  1. 不能修饰成员属性

  2. 父类中的方法被 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()
?>
  1. 一个类被 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)
?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值