1. 类与对象
(1)定义类时 类名不能有$。
class COMPUTER{ }
定义类的属性时,属性时变量,要有$。
class COMPUTER{
public $cpu="intel";
}
对象使用属性时,直接用属性名,不能有$
$computer=new COMPUTER();
echo ($computer->cpu);
定义函数时 函数名前不能有$
function test(){}
(2)构造方法与析构方法
构造 public function __construct(){} 都是两个下划线
析构public function __destruct(){} 一般在一个类里的最后部分定义。也可以手动关闭对象。使用unset($object);
(3)类常量
类常量是在类的内部定义的常量。一般是供类自己调用,而不是给类的对象调用。
<?php class COMPUTER{
const ONE=1; // const定义类常量
const TWO=self::ONE+1;
//使用self来调用类常量,而不是用$this(前者代表类自己,后者代表一个实例化对象)。
}
echo (COMPUTER::TWO);
?>
:: 作用域限定操作符 (Scope Resolution Operator)可以引用类里面的常量,静态方法或者静态属性,而且不需要实例化。如在类外调用类的TWO属性。直接echo(COMPUTER::TWO);
也常结合parent用
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "我是 SubClass 下的构造函数\n";
}
}
(4)extends(继承)与final关键字
final关键字后的类不允许继承,final关键字后的方法不能被重写
final class parent{}
(5)namespace命名空间
a. 文件1 namespace xx\xxxxx\xxxxx;
文件2 namespace xx\xxxxx;
假设文件1,2都有一个同名的类A,要在文件3使用两个A。建议在文件3 include两个文件后。用如下语句
use xx\xxxxx\xxxxx\A;
use xx\xxxxx\A as A2; //给文件2的A起个别名
b. 函数的处理方法有点不同,假设同名函数A().在文件3中用如下语句,多了个function.且use时函数名没有双括号
use function xx\xxxxx\xxxxx\A;
use function xx\xxxxx\A as A2; //给文件2的A()起个别名
c.常量则是将function换成const
d.在指定命名空间的文件内调用全局的类,函数,常量。需要在类,函数,常量前加反斜杠\ 否则会把被调用的东西当做在该命名空间内的
(6)类的自动重载
使用更先进的spl_autoload_register()函数。可以省去在main文件开头的一大串include "filename.php"
而一次性引入。
自动重载可以在文件中试用另一个文件的类。并且无需include。此处test类来源于另一文件test.php。当直接实例化时,发现本文件没有该类的声明,于是执行重载函数。$classname的值就是classes\test,即命名空间加类名。
下图的test文件内定义了test类,并声明了命名空间,在main中使用了test类。
建议在各个类文件中一来就定义命名空间 namespace xx\xxx\xxxx。且命名空间加上类名与该文件的项目路径一致。
(7)static静态属性和方法
static过后的类和方法,相当于属于该类,可以不用实例化类。直接在类外用类名调用。在类的内部调用静态方法或静态属性用 self::xxx
(8)后期静态绑定(static)
正常情况如下图所示,输出是 “A类的who方法” self指的A类
下图是加了静态绑定static,会根据上下文判断当前调用的是谁,输出是“B类的who方法”
(9)魔术方法
1. __set($name,$value){
$this->$name=$value; // 用$this访问属性$name时,要加$(否则会把name当成一个固定的属性处理,而此处的$name显然是一个变量,意义是类里面的任何私有属性),而正常情况下对象访问属性取值是没有$的
}
2.__get($name){
return $this->$name;
}
3.__isset($name){
return isset($this->$name); //类外对象调用isset()查看私有属性是否存在时
//会首先访问__isset()查看是否存在该 私有属性
}
4.__unset()与上面同理
5.__call()方法 当在类外调用不存在的方法时,会转去执行__call()方法。这样程序不会因为找不到方法而终止,会继续执行下去
6.__callStatic()方法 针对静态方法
7.__invoke() 把对象当函数使用。参数传给__invoke()。
8.__toString() 直接打印对象时被调用
(10)对象拷贝和类型约束
1. 浅拷贝 (默认)
$a=new A();
$b=$a; //浅拷贝a b指向同一块内存区,改变b的属性,a的属性也会变
2.深拷贝
$a=new A();
$b=clone $a; //深拷贝,b的改变不会影响a 更占内存
3.__clone()魔术方法 解决作为属性值的对象的深拷贝
4. 类型约束
就是 A $a; //变量a时A类型的对象