面向对象编程是一种更高层次的抽象,是一种更有序,灵活和直观的编程方式
类的创建
使用class关键字创建一个类,通常,类名首字母大写
class NewClass{ //创建属性 public $attribute1; protected $attribute2; private $attribute3; //创建方法 public function method1() { } protected function method2() { } private function method3() { } }
对象的创建
使用new关键字+类名创建该类的一个对象
class Test{ public $attribute1 = 'test_attribute'; } $new_test_obj = new Test; //当构造函数不需要参数来初始化一个对象时,类名后可以不写括号 echo $new_test_obj->attribute1; //访问一个对象的属性时,属性前面不能写美元符$ 结果:test_attribute
重写构造函数__construct可以在创建一个对象时对其属性进行初始化
class Test{ public $attribute1 = 'test_attribute'; function __construct($value1) { $this->attribute1 = $value1; } } $new_test_obj = new Test('传递参数'); echo $new_test_obj->attribute1; 结果:传递参数
重写析构函数__destruct可以在一个对象被销毁时执行定义的代码(使用unset销毁一个对象,或者脚本执行结束会被自动销毁
静态属性和方法的调用
静态属性和方法可以在不创建对象的情况下直接使用类名调用(对象也可以调用),但在php中,操作符也区别,静态属性和方法的调用使用双冒号::
作为操作符
静态方法中,不允许使用$this来调用本类的其他方法和属性,需要使用self(调用本类),parent(调用父类),static(优先调用本类,不存在时调用父类),也需要使用::
来访问,并且需要给属性加上美元符$,静态属性和方法前也可以被public,protected.private修饰
class Car {
protected static $speed = 10;
public function getSpeed() {
return self::$speed; //静态属性的访问必须添加美元符
}
}
class CarChild extends Car{
static $speed = 20;
public function getParentSpeed()
{
return parent::$speed;
}
}
$car = new Car();
$car_child = new CarChild;
echo Car::$speed; //类名直接访问
echo $car::$speed; //对象访问
echo $car->getSpeed(); //通过方法从内部读取
echo $car_child->getParentSpeed() //子类对象读取
继承
如上所示,使用extends关键字继承
class ChildClass extends ParentClass{ }
重载
- 使用
__set,__get,__isset,__unset__call,__callstatic
方法可以设置在访问不存在的属性和方法时进行的操作,从而动态地给对象增加属性或者方法。(当然,由于php是弱类型的语言,其变量本身不需要事先定义,因此直接给不存在的属性赋值也可以动态地创建新的属性) __set
在给不存在的属性(或外部不可见的内部属性)赋值时被调用,并会得到两个参数——属性名和值,根据这两个参数可以动态构建属性__get
在读取不存在的属性(或外部不可见内部属性)赋值时被调用,并会得到一个参数——属性名,根据该参数可以采取响应操作__isset
在外部使用isset函数判断某个不能被外部访问的属性是否存在时调用,并会得到一个参数——属性名,根据该参数可以采取响应操作__unset
在外部使用unset函数销毁某个不能被外部访问属性时被调用,并会得到一个参数——属性名,根据该参数可以采取响应操作__call
在外部调用不存在的普通方法时被调用,并会得到两个参数——方法名和传入的参数数组,遍历该数组可以得到外部给该属性传递的所有参数,根据方法名和参数可以执行不同操作,据此可以实现根据参数区别同名方法(java或c++种的重载)__callstatic
与__call
类似,在外部调用某个不存在的静态方法时被调用