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

来源:互联网 发布:ipython 源码安装 编辑:程序博客网 时间:2024/05/01 13:54

写在前面的话

自己写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();/**输出结果:123456456**/

从上面输出的结果可以看出,现在的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 errorclass 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'));

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

0 0
原创粉丝点击