目录
创建对象
$对象名 = new 类名();
$对象名 = new 类名;
- new 是一个关键字,表示创建一个新的实例。
- 在类定义内部,可以用
new self
和new parent
创建新对象。
成员属性
成员属性必须要有访问修饰符,如果不写,会报错。
成员属性的默认值为NULL。
示例:
class Test {
public $name; //共有
protected $height; //保护
private $age; //私有
}
成员方法
成员方法如果不写访问修饰符,则默认为public。
我们可以指定成员方法里的参数的类型,如 类类型,或者数组类型(array),也可以是接口类型,但是接口类型要注意,因为接口没有实例,当我们声明参数类型为接口类型的时候,那么传入的参数只要是实现了该接口的类的实例即可。
示例:
class Test {
function hello() {} //默认为public
public function say() {} //公有
protected function smile() {} //保护
private function laugh() {} //私有
}
构造方法
- 一个类里只能有一个构造方法。
- 没有返回值(即使在构造方法里写了返回值也没有意义)
- 在创建一个类的新对象时,系统会自动的调用类的构造方法完成对新对象的初始化。
- 如果我们没有重写默认构造函数,那么系统会默认帮我们创建一个没有参数的构造函数,
public function __construct(){}
,如果我们重写了构造函数,那么我们自定义的构造函数就会覆盖系统默认的构造函数。 - 如果我们自定义的构造函数里有行参,那么当我们创建对象的时候就必须传入相应的实参。否则会报错。
示例:
class Test {
public function __construct() {
echo 'hello, world<br>';
}
}
$testObj = new Test();
class One {
public function __construct($param) {
echo $param;
}
}
$oneObj = new One('hello, world<br>');
输出结果:
hello, world
hello, world
析构方法
- 当一个对象没有被任何变量引用时就会自动销毁,并在被销毁前自动调用析构函数,无论程序有没有结束,只要一个对象没有被任何变量引用就会被销毁。
- 当PHP程序运行结束后,所有的对象都会被销毁,对象在被销毁前,会自动调用析构函数。
- 默认情况下,析构函数销毁对象的顺序和创建对象的顺序正好相反。最先创建的对象最后被销毁,强调默认情况下是因为,我们可以手动销毁对象,这样的话对象销毁的顺序就和默认情况不一样了,当PHP程序执行完后,那时候销毁对象的方法就是采用的默认方法。
- 如果我们定义的一个类里专门有个属性是用来连接数据库的,当我们创建了该类的实例对象,并且用该成员属性连接数据库后,如果该类型的实例对象占用资源较大,我们往往会在使用后就立即销毁,虽然该对象能被销毁,但是该对象的成员属性所连接的资源却不会被自动销毁,需要我们自己手动销毁,这时,我们可以在析构函数里添加一句关闭数据库连接的语句就好了(mysql_close(要关闭的资源))。
示例:
class Test {
public function __construct() {
echo 'hello, world<br>';
}
public function __destruct()
{
echo '执行一些回收资源的操作<br>';
}
}
$testObj = new Test();
输出结果:
hello, world
执行一些回收资源的操作
垃圾回收机制
- 在PHP中,当一个对象没有任何引用指向它的时候,就会成为一个垃圾对象,PHP将启用垃圾回收器将对象销毁。
- 在PHP程序退出前,PHP也将启用垃圾回收器,销毁对象。
访问修饰符
public
如果没有为方法指定访问修饰符,它将是
public
。公有的属性或方法可以在类的内部或外部进行访问。protected
如果一个属性或方法指定访问修饰符为
protected
,那么被标记的属性或方法只能在类内部访问,被修饰的属性和方法能被子类继承。private
如果一个属性或方法指定访问修饰符为
private
,那么被标记的属性或方法只能在类内部访问,私有的属性和方法将不会被继承。
魔术方法
魔术方法都是在满足某个条件时,由系统自动调用。
魔术方法的名字,都是以两个下划线(__)开头的,因此我们在自定义函数时,函数名不要以两个下划线开头。
一些常用的魔术方法
__construct(): 构造方法 __destruct(): 析构方法 __set(): 在给不可访问属性赋值(比如:protected/private/不存在)时,__set()会被调用。 __get(): 读取不可访问属性的值(比如:protected/private/不存在)时,__get()会被调用。 __isset(): 当对不可访问属性(比如:protected/private/不存在)调用isset()或empty()时,__isset()会被调用。 __unset(): 当对不可访问属性(比如:protected/private/不存在)调用unset()时,__unset()会被调用。 __toString(): 当我们把一个对象当做字符串输出时,就会自动调用__stoString()方法。 __clone(): 如果定义了__clone方法,则新创建的对象clone(复制生成的对象)中的__clone()会被调用。用法如下: $copy_of_object = clone $object; 克隆后的对象与原对象的地址不一样。 当对象被复制后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。 如果想防止其他程序员克隆某个对象,可以重写__clone()方法并把访问修饰符设置为private。 __call(): 在对象中调用一个不可访问(比如函数访问修饰符为protected/private/不存在)方法时,__call()会被调用。 __callStatic(): 用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。
对象比较
当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值 都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等。
而如果使用全等运算符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。
示例:
class Test {
public $name = 'itbsl';
public $age = 25;