1. 定义一个类
class Car{
var $name ='汽车';
function getName(){
return $this->name;
}
}
var代表属性,function代表方法
2. 创建一个类的实例
$car = new Car();
//也可以采用变量来创建
$className='Car';
$car=new $className();
3. 类的属性
类中定义的变量称之为属性,也称为字段。可以被访问控制关键字public、private、protected修饰
4. 类的方法
类中定义的函数称之为方法,可以受访问控制关键字public、private、protected修饰
也可以被static修饰,称为静态方法,通过类名和双冒号::直接访问。
class Car{
var $name ='汽车';
public static function getName(){
return $this->name;
}
}
echo Car::getName();
5. 构造函数与析构函数
class pCar{
function __construct(){
print "父类的构造函数";
}
}
class Car extends pCar{
var $name ='汽车';
function __construct(){
print "构造函数\n";
parent::__construct();
}
function __destruct(){
print "析构函数\n";
}
public static function getName(){
return $this->name;
}
}
$car=new Car(); //此时调用构造函数
unset($car); //此时调用析构函数,PHP代码执行完毕后会自动回收和销毁对象,一般不需要显示调用unset
6. static静态关键字
用类名::方法名的方式调用。在静态方法中,不允许使用$this,可以使用self、parent。static在内部调用静态方法与属性。
class pCar{
public static $speed=10;
public static function start(){
return self::$speed;
}
}
class Car extends pCar{
public static function getSpeed(){
parent::start();
}
}
pCar::start();
7. 访问控制
- 被定义为公有的类成员可以在任何地方被访问
- 被定义为受保护的类成员可以被其自身以及其父类和子类访问
- 被定义为私有的类成员只能被其定义所在的类访问
7.1 类属性必须定义访问控制类型,如被定义为var则表示公有类型(为了兼容PHP5以前的版本)
7.2 类方法的访问控制类型省略时表示公有
7.3 如果构造函数定义为私有方法,则不允许直接实例化对象,这时候一般通过静态方法进行实例化。在设计模式中经常使用这样的方法控制对象的创建,比如单例模式只允许有一个全局唯一的对象。
class Car{
private function __construct(){
echo 'object create';
}
private static $object=null;
public static function getInstance(){
if(empty(self::$object)){
self::$object=new Car();
}
return self::$object;
}
}
//$car=new Car(); //不允许
$car=Car::getInstance();
8. 对象继承
extends关键字
9. 重载
PHP的重载指动态地创建类属性和方法,是通过魔法方法(以两个下滑线开头的方法)实现的。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。
class Car{
private $ary=array();
public function __set($key,$val){
$this->ary[$key]=$val;
}
public function __get($key){
if(isset($this->ary[$key]))
return $this->ary[$key];
return null;
}
public function __isset($key){
return isset($this->ary[$key]);
}
public function __unset($key){
unset($this->ary[$key]);
}
}
$car=new Car();
$car->name='汽车'; //name属性动态创建并赋值
方法的重载通过__call()来实现,当调用不存在的方法时,转为参数调用__call()方法,当调用不存在的静态方法会使用__callStatic()重载。
class Car{
public $speed=0;
public function __call($name,$args){
if($name=='speedUp'){
$this->speed+=10;
}
}
}
$car=new Car();
$car->speedUp();
10. 高级特性
10.1 对象比较
当同一个类的两个实例的所有属性都相等时,比较运算符==判断为true
当两个变量为同一个对象的引用时,比较运算符判断符===判断为true
10.2 对象复制
通过关键字clone复制对象,这时__clone()方法被调用
$a=new Car();
$a->name='new car';
$b=clone $a;
10.3 对象序列化
可以用serialize方法将对象序列化为字符串,用于存储或者传递数据,然后在需要的时候通过unserialize将字符串反序列化为对象进行使用。
$a=new Car();
$str=serialize($a);
$b=unserialize($str);