20171117

魔术方法

__isset()

此方法是用于检测私有属性是否存在

isset():此方法是检测变量是否存在

__unset()

用户在删除私有属性的时候会调用此方法

unset():删除私有属性

__call

当调用的方法不存在时,此方法会被调用。这样程序在调用不存在的方法时不会出现错误,而是会正常的执行下去。

例如:

// 第一个参数为被调用的方法名,第二个参数为该方法传递的参数
public function __call($funcName, $arguments) 
{
    echo($funcName);
    print_r($arguments);
}

__callStatic

当调用的静态方法不存在时,此方法会被调用。

对象拷贝和类型约束

对象复制分为两种方式:浅拷贝、深拷贝

浅拷贝:使用等于号直接实现

深拷贝:使用clone关键字来实现

如果类中有对象属性,则使用clone关键字并不能把此对象属性深拷贝了,所以,应该使用__clone()魔术方法

public function __clone() 
{
      $this->obj = clone $this->obj;
}

自PHP5起,我们就可以在函数(方法)形参中使用类型约束了。

函数的参数可以指定的范围如下:

  1. 必须为对象(在函数原型里面指定类的名字);
  2. 接口;
  3. 数组(PHP 5.1 起);
  4. callable(PHP 5.4 起)。
  5. 如果使用 NULL 作为参数的默认值,那么在调用函数的时候依然可以使用 NULL 作为实参。

如果一个类或接口指定了类型约束,则其所有的子类或实现也都如此。

注意:在PHP7以前,类型约束不能用于标量类型如 int 或 string。Traits 也不允许。

标量类型声明 (PHP 7)

  1. 字符串(string),
  2. 整数 (int),
  3. 浮点数 (float),
  4. 布尔值 (bool)。

PHP实现多继承--trait语法

自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。

使用trait来声明,然后在类中使用use来使用

同一个class中,可以使用多个Trait;Trait之间也可以相互嵌套

Trait中属性的优先级:

  1. 来自当前类的成员覆盖了 trait 的方法(类中的方法覆盖trait中的方法)
  2. trait 覆盖了被继承的方法

trait

下次课程

traitinterfaceabstract

接口、抽象类

设计模式

最后更新于 21st Nov 2017