ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 对象的赋值 - 对象的赋值与普通的变量,数组的赋值不一样,变量的赋值是引用赋值(即两个变量指向同一块内存空间)。可以通过clone 来创建一个对象的副本 - clone 对象时,是对对象的浅复制,若对象中的属性也是一个对象的话,clone前后的对象该属性都是指向同一块内存空间的。我们可以使用魔术方法__clone克隆时,对属性在进行克隆一次。 ``` public function __clone() { $this->pro_obj = clone $this->pro_obj } ``` ### require, include, use, require_once - require_once 只会加载同一个文件一次,而require可以加载同一个文件多次 - require 和 include 都是包含文件,区别在于require在找不到文件时会error中断程序,而include这会warning,程序继续执行 - use 导入命名空间。 ### 范围解析符 :: (self::, static::, parent::) ### self, static, $this 的区别 - self 代表当前类 - static 代码所在的方法被哪个类调用,则就代表那个类 - this 代表当前类的实例 ### new self 和 new static - new self 当前代码是在哪个类中,就是实例化那个类的实例 - new static 当前代码所在的方法是被哪个类调用的,则就是实例化那个类的实例 ### static 的静态访问 - static定义的方法或属性,在程序第一次进行加载时,即驻留内存,程序结束时,释放。 - 通过static申明的变量为静态变量,是该类的公共变量。第一次使用时即生成,对应该类的所有对象只有一份。是属于类的,不是属于对象的。static变量是属于类而不属于对象,可以在任何地方通地类来访问,是类的全局变量,类创建时即存入内存。对多个对象来说,静态数据成员只存储一处,可以节省内存。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值。 - 通过static申明的方法为静态方法。执行该方法时不会将对象引用传给函数,所以我们不能访问非静态成员,只能访问静态方法或静态变量。只能使用关于类的方式如self static parent等。使用时不用生成对象即可执行 - 静态方法中不可使用伪变量$this,则可以使用self,static, parent ``` 通过类名访问:(通过类名只能访问静态方法,静态属性和部分非静态方法) 类::静态方法 类::静态属性 类::非静态方法(方法中不能包含$this) 通过类的实例访问 实例::静态属性 实例::静态方法 实例->非静态属性 实例->非静态方法或静态方法 ``` ### final修饰词 - 若一个类声明了 final,则这个类不能被继承 - 若父类中的方法使用了final修饰符, 则该方法不能被子类重写 ### call_user_func 和 call_user_func_array - 功能都是调用指定的函数,或类方法。区别在于第二个参数。call_user_func_array是已数组的形式传参。 - 调用方法`call_user_func('test', 'hello', 'world')` `call_user_func_array('test', ['hello', 'world'])` - 调用类方法 `call_user_func(['User', 'test'], 'hello', 'world')` `call_user_func_array(['User', 'test'], ['hello', 'world'])` - 调用静态方法`call_user_func('User::test', 'hello', 'world')` `class_user_func_array('User::test', ['hello', 'world'])` - 调用对象方法 `call_user_func([$obj, 'test'], 'hello', 'world')` `call_user_func_array([$obj, 'test'], ['hello', 'world'])` ### trait代码块