《深入PHP面向对象、模式与实践》学习笔记

  1. 类属性声明关键字
    PHP4:在PHP4中,所有的属性都用var关键字声明,它的效果和使用public一样。如果使用public、private、protected关键字声明,代码将无法正常工作。
    PHP5:使用public、private、protected关键字声明,考虑到向后兼容,PHP5中保留了对var的支持,但会自动转换为public。
    我的开发规范:类属性的声明必须使用public、private、protected关键字,不允许使用var关键字。
  2. 构造方法的定义
    PHP4:通过声明一个和类的名称相同的方法创建一个构造方法,不会把__construct()方法当做构造方法。
    PHP5:1、使用__construct()方法来定义构造方法;2、通过声明一个和类的名称相同的方法创建一个构造方法。
    我的开发规范:命名构造方法必须使用__construct()
  3. 关于构造、析构方法和继续
    PHP的构造与析构的过程是:
    PHP 4 不会从派生类的构造函数中自动调用基类的构造函数。恰当地逐次调用上一级的构造函数是用户的责任。 (来源PHP 4 手册)
    如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类中没有定义构造函数,则会隐式调用其父类的构造函数。
    PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。 (PHP 5 手册)
    C++的构造与析构的过程是:基类构造->派生类构造->派生类析构->基类析构。这才是成熟的机制。在子类中定义构造方法时,需要传递参数给父类的构造方法,否则得到的可能是一个构造不完整的对象。
    要调用父类的方法,首先要找到一个引用类本身的途径:句柄(handle)。PHP为此提货了parent关键字。要引用一个类而不是对象的方法,可以使用::而不是->。其它文章摘要:
    构造方法是类中的一个特殊方法。当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称是 __construct() 。所以通常用它执行一些有用的初始化任务。该方法无返回值。
    如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。

    与构造方法对应的就是析构方法,析构方法会在某个对象的所有引用都被删除或者当对象被显式销毁之前执行的一些操作或者功能。析构函数不能带有任何参数,其名称必须是 __destruct() 。
    同样,如果子类中定义了析构函数则不会暗中调用其父类的析构函数。要执行父类的析构函数,需要在子类的析构函数中调用 parent::__destruct()。

    注意:在析构函数中抛出一个异常会导致致命错误。

    <!--?php class Construct{     protected $a;     protected $b;     function __construct($a,$b){  //定义构造函数         $this--->a=$a;
            $this->b=$b;
        }
        function __destruct(){  //重新定义为初始值
            $result=0;
            echo '恢复乘积的初始值:'.$result;
        }
    }
    
    class son extends construct{
        private $c;
        function __construct($c){
            parent::__construct(6,10);    //调用父类的构造方法,使用方法:parent::__construct(); 有参数加参数
            $this->c=$c;
        }
        function show(){
            $result=$this->a*$this->b*$this->c;
            print 'abc的乘积是:'.$result.' ';
        }
        function __destruct(){
            parent::__destruct();  //调用父类的析构函数,使用方式:parent::__destruct();
        }
    }
    
    $test=new son(12);   //实例化对象
    $test->show();   //abc的乘积是:720  恢复乘积的初始值:0
    
    ?>
    

    关于继承:
    可以把继承理解为“搜索”,例如当我们调用子类的A方法时,在子类中并没有找到这样的方法,那么子类就

    会自动查找父类中的默认实现。另一方面,当调用子类的B方法时,在子类中找到则直接调用。php的构造函数

    调用是从自身向上查找,执行最近的一个来进行调用。

  4. public、private、protected:管理类的访问
    在任何地方都可以访问public属性和方法。
    只能在当前类中才能访问private方法或属性,即使在子类中也不能访问。
    可以在当前类或子类中访问protected方法或属性,其它外部代码无权访问。
    一般来说,我们倾向于严格控制可访问性。最好将类属性初始化为private或protected,然后在需要的时候再放松限制条件。类中的许多(如果不是大多数)方法都可以是public,但是如果拿不定主意的话,就限制一下。有些类方法只为类中其它方法提供本地功能,与类外部的代码没有任何联系,应该将其设置为private或protected。
    当客户程序员需要使用类中保存的值时,通常比较好的做法是不要允许直接访问属性,而是提供方法来取得需要的值,这样的方法被秒为访问方法,也可称为getter和setter。
  5. 静态方法和属性
    我们不仅可以通过对象访问方法和属性,还可以通过类来访问它们。这样的方法和属性是“静态的”(static),必须用static关键字来声明。
    注意:static关键字是在PHP5中引入的,在PHP4中不能使用。
    静态方法是以类作为作用域的函数。静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性。
    因为是通过类而不是实例来访问静态元素,所以访问静态元素时不需要引用对象的变量,而是使用::(两个冒号)来连接类名和属性或类名和方法。
    一个子类可以使用parent关键字来访问父类,而不使用其类名。要从当前类(而不是子类)中访问静态方法或属性,可以使用self关键字。self指向当前类,就像伪变量$this指向当前对象一样。
    只有在使用parent关键字调用方法的时候,才能对一个非静态方法进行静态形式的调用。其它任何情况都需要先生成一个对象,然后使用->符号调用对象中的方法。除非访问一个被覆写的方法(例如子类中调用父类的构造函数parent::__destruct();),否则永远只能使用::访问被明确声明为static的方法或属性。
    根据定义,我们不能在对象中调用静态方法,因此静态方法和属性又被称为类变量和属性,因此不能在静态方法中使用伪变量$this。
发表评论?

0 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据