《PHP权威指南》第一章节笔记

本文深入探讨了PHP5中对象引用的变化、final关键字的作用、静态方法与属性的应用、抽象类及方法的概念,以及函数参数的对象类型提示等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面的话

自己写php代码也有半年的时间了,在这半年里,有收获,有喜悦,也有迷惑. 从不懂php, 到现在可以作为一个普普通通的板砖人士. 回过头来发现自己对于PHP基础的东西还是不会. 决定回到以前,重新学习PHP基础知识。 从最为经典的《PHP权威指南》入手,把自己看到记录下来,一来回顾,二来鞭策自己。 希望能与大家一起共勉

1.对象的引用

  • 在php 5之前的版本,如果把一个对象变量赋值给一个新的变量,那么这个新的变量并不是和原来的变量指向同一对象,而是重新创建一个新的对象. 当然现在不会出现这一问题, 如果要使用创建对象的副本可以使用 clone, 如:$new-object=clone $object ,来创建一个新的对象. 我们也可以创建一个类,来证明上面所说的
class Person
{
    private $name;
    public function getName()
    {
        return $this->name;
    }
    public function setName($name)
    {
        $this->name = $name;
    }
    public function __construct($name)
    {
        $this->setName($name);
    }
}
$Person=new Person('123');
echo $Person->getName()."<br/>";
$PersonTwo=$Person;
$PersonTwo->setName('456');
echo $Person->getName()."<br/>";
$PersonThree= clone $Person;
$PersonThree->setName('789');
echo $Person->getName();
/**
输出结果:
123
456
456
**/

从上面输出的结果可以看出,现在的PHP版本,对于对象变量间的赋值是引用赋值,而不是新建对象. 而clone 可以生成一个新的对象. clone在拷贝对象的时候,会见对象的属性值等信息一起拷贝.

  • 我们也可以用instanceof来监测这个对象变量是哪个对象的,
$Person=new Person('123');
echo  $Person instanceof Person;
//返回1表示是这个对象的变量, 返回0则不是
//输出: 1

2. final声明的方法和类

  • 用final方法声明过的类,是不能继承的, 如果继承这样的类,php会发出这样的错误信息,

Fatal error: Class PersonT may not inherit from final class (Person),翻译过来的意思是: 致命的错误,final类Person不能被PersonT类继承.

//即便你的类中什么也不写, 你也不实例化它,就把他放在脚本里,你在运行脚本的时候,就会发生Fatal error
class PersonT extends Person
{

}
  • final 声明的方法不可以被重写, 也就是不能再子类中定义这个方法,同样的也是致命错误:
    Fatal error: Cannot override final method Person::setName()
//用final定义的的方法是Person类中的setName方法
class PersonT extends Person
{
  public function   setName($name){
     echo  $name;
  }
}

3.静态方法和静态属性

静态方法不用实例化类,直接使用类名就可以调用, 比如Singleton::getInstance(),在静态方法里头不能使用$this, 因为它没有绑定到具体的对象。静态属性可以用类自身来访问self::instance, 静态方法也可以使用self来访问,当然这个静态方法必须是类自己的

//这里我们创建了一单件模式
class Singleton
{
    private static $instance = null;
    public  static $param=321;
    private function __construct()
    {}
    public static function getInstance()
    {
        if (self::$instance == null) {
            self::$instance = new Singleton();
        }
        return self::$instance;
    }
    public function __toString()
    {
        return 'object';
    }
}

echo Singleton::getInstance();
echo Singleton::$param;
//输出: object 321

4.抽象类和抽象方法

  • 抽象类,就是用abstract 定义的类就是抽象类, 抽象类中可以没有抽象方法,但是抽象类不能实例化, 必须由子类继承,然后实例化.如果子类没有实例化抽象类中的抽象方法,在加载子类脚本文件的会发生致命错误.
//在加载这个脚本文件的时候就会有错误信息提示
abstract class BaseClass
{
    protected $name;
    abstract public function getName();
    public function setName($name)
    {
        $this->name = $name;
    }
}
class MyClass extends BaseClass
{
    // public function getName()
    // {
    //     echo $this->name;
    // }
}

5.函数声明的时候可以给参数进行对象类型提示

如果我们在给函数或者方法传递参数的时候,为了避免传入错误的对象变量,可以使用 function test(Singleton $object) ,这样声明函数后,如果传入的对象类型不是Singleton,有这样的错误提示:

Catchable fatal error: Argument 1 passed to test() must be an instance of Singleton

//代码块
function test(Singleton $object){
    echo '1234';
}
test(new Person('12'));

今天的内容就到这里, 晚安!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值