一、对象的认识
1.对象的形
类由属性和方法构成,同一类的不同对象区别于属性。对象是属性的集合。
·对象的序列化(把保存在内存中的对象属性保存起来),反序列化(还原)
class person{ public $name; public $age; public function say(){ echo $this->name.'is'.$this->age; } }
$student = new person(); $student->name = tom; $student->age = 10; //序列化 $str = serialize($student); File_put_contents('store.txt',$str); //反序列化 $str = file_get_contents('store.txt'); $student = unserialize($str);
2.对象的本
对象在底层存储为“属性数组”和“类指针”,即保存了对象属性和类入口
3.对象与数组:对象和数组在内容上一模一样,区别仅仅在于对象有一个指向类的指针
4.对象与类:对象只是数据,本身不包含方法。对象有一个指针指向一个类。
二、魔术方法
魔术方法在特定情况下可以自动调用,用于实现程序的健壮性,编写时需要return返回。
1. __set和__get方法
·set可以设置原类中private修饰的属性变量,或者在设置原类中不存在的变量时可以自动调用set方法,防止直接报错,增强健壮性。
·get可以获取原类中private修饰的属性变量,或者在获取原类中不存在的变量时可以自动调用get方法,防止直接报错,增强健壮性。
class Account{ private $user = 1; private $pwd = 2; public function __set($name, $value){ echo "set $name to $value "; }
public function __get($name){ if(!isset($this->$name)){ echo "未设置"; $this->$name = "正在设置默认值"; } return $this->$name; } } $a = new Account(); echo $a->user;//通过get方法获取原类中private的属性变量 $a->name = 5;//原类中并未有name这一属性变量,自动调用set方法,进行提示 echo $a->name; echo $a->big;//原类中并未有big这一属性变量,自动调用 get方法,进行提示
2.__call和__callStatic方法
当调用一个不能被调用的函数(设置不可见或者不存在)时,call方法就会被自动调用。
3.__tostring方法
用于echo打印对象。当类中有该方法时,echo打印对象可以自动调用。
可以自定义打印对象的格式。
class Account{ public function __tostring(){ return "打印对象"; } } $a = new Account(); echo $a;
三、继承和多态
1.类的复用方式
1)类的组合:
在类A中创建类B的对象,并调用类B的方法解决问题。(其中,类B的对象被当做类A的属性)
2)继承
在子类中调用父类的属性和方法:
子类中通过“parent::父类方法名”来调用父类的方法;
子类中通过“parent::父类属性名”来调用父类的属性。
class A{ public $name = "first"; static $gender = 10; public function __construct(){ echo "这里是父类",PHP_EOL; //PHP_EOL是php换行符 } public function say(){ echo $this->name; } }
class B extends A{ public $name; static $gender = 12; public $age; public function __construct(){ parent::__construct(); //子类中通过“parent::父类方法名”来调用父类的方法 echo "这是子类",PHP_EOL; } public function cry(){ echo parent::$gender,PHP_EOL; //子类中通过“parent::父类属性名”来调用父类的属性 echo self::$gender,PHP_EOL; //子类中通过“self::属性名”来调用和父类同名的属性 } } $test = new B(); $test->cry();
·其中::还能调用静态方法,不要把这两种情况搞混。
2.继承存在的问题
继承破坏封装性,是紧耦合的,扩展复杂,还可能违反现实逻辑(固化关系)
【如何使用继承?】
①要精心设计专门用于被继承的类
②不是专门用于继承的类要用final修饰符禁止被继承
③优先考虑使用组合关系
④子类是一种特殊类型,不只是父类的一个角色
⑤子类拓展,不是覆盖或者让父类的功能失效
⑥底层代码多用组合,顶层代码多用继承
3.多态
多态指同一类的对象收到相同消息的时候,会得到不同的结果。
如C++和java可以实现father pf = new son,把派生类对象赋给基类对象,在调用函数时动态改变其指向。但PHP却不可以这样操作。
PHP本身就是多态的,可以通过判断传入对象所属的不同类来调用同名方法,但PHP又是弱类型语言,也没有对象转型机制。