深入分析php之面向对象
以前对面向对象仅限于死记硬背型,工作这么久了,回过头来看又是一翻体悟,供大家看看。
1.final
final:php5新增一个final关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法;如果一个类被声明final,则不能被继承。
class baseclass{
public function test(){
ehco "test";
}
final public function moretest(){
echo "moretest";
}
}
class childclass extends baseclass{
public function moretest(){
echo "moretest";
}
}
// 产生 fatal error: cannot override final method baseclass::moretest()
2.__tostring(建议用php5.2或者更高版本)
class person{
protected $name;
protected $email;
public function setname($name){
$this->name = $name;
}
public function setemail($email){
$this->email = $email;
}
public function __tostring(){
return "$this->name <$this->email>";
}
}
$rasums = new person;
$rasums->setname('test');
$rasums->setemail('test@qq.com');
print $rasums;
3.接口和抽象类
接口的作用:你想要保证一个类按照特定的名称、可见性和原型实现一个或多个方法。
接口的要求:
类中全部为抽象方法
抽象方法钱不用加abstract
接口抽象方法属性为public
成员属性必须为常量
例:
interface childtest{
public function childtest();
}
class fathtest implements childtest1,childtest2{
public function childtest(){
echo 1;
}
…………
}
抽象的作用: 其实抽象类和接口类有一部分很像,记得在哪里看见这样一句话,抽象类就把类像的部分抽出来,这句看上去很搞笑,其实它说出了抽象类的真理,抽象类的作用 是,当你发现你的很多类里面用很多方法你不断的在重复写,那你就可以考虑使用抽象类了,你可能会说“我不是可以重写一个类每个公共类我个实例化一个这个公 共类,调用相同的方法就可以了”,这里是可以,实际上抽象类做的工作也就是这个,不过他省去了你实例化的这个步骤,让你就像直接调用本类方法一样方便,而 且你还可以重载这个方法。
抽象的要求:
类中至少有一个抽象方法
抽象方法钱必须加abstract
例:
abstract class database{
abstract public function connect();
abstract public function query();
abstract public function fetch();
abstract public function close();
}
注:抽象方法不能定义为私有方法、不能定义为最终方法,因为它们需要被继承。
4.传递对象引用
php4:所有“=”都是创建一个副本
php5:除了对象外,其他“=”进行赋值时,都是创建一个副本;而对象则是引用
5.克隆对象
一、
聚合类:
__call方法简介:
当客户端代码用类中未定义的方法时,__call会被调用。
__call()接受两个参数,一个是方法名称,另一个是传递给要调用方法的所有参数(包括数组)
__call()方法返回的任何值都会返回给客户,将好像调用方式真实存在一样
例:
class address{
protected $city;
protected $country;
public function setcity($city){$this->city = $city;}
public function getcity(){return $this->city;}
public function setcountry($country){$this->country = $country;}
public function getcountry(){return $this->country;}
}
class person{
protected $name;
protected $address;
//浅克隆
public function __construct(){
$this->address = new address;
}
public function setname($name){
$this->name = $name;
}
public function getname(){
return $this->name;
}
public function __call($method,$arguments){
if(method_exists($this->address,$method)){
return call_user_func_array(array($this->address,$method),$arguments);
}
}
//深克隆
public function __clone(){
$this->address = clone $this->address;
}
}
$test1 = new person;
$test2 = clone $test1;
$test1->setname('testname1');
$test1->setcity('testcity1');
$test2->setname('testname2');
$test2->setcity('testcity2');
echo $test1->getname().'-'.$test1->getcity()."\n";
echo $test2->getname().'-'.$test2->getcity()."\n";
//testname1-testcity2
//testname2-testcity2
6.重要属性访问(__set __get __isset __unset) __isset __unset5.1之后才有用
作用:拦截对属性的需求,为了提高分离的程度,还要实现__isset()和__unset(),以便当我们用isset来检测属性或者unset()来删除属性,来保证类的行为正确
例:
class person{
protected $__data = array('email','test');
public function __get($property){
if(isset($this->__data[$property])){
return $this->__data[$property];
}else{
return false;
}
}
public function __set($property,$value){
if(isset($this->__data[$property])){
return $this->__data[$property] = $value;
}else{
return false;
}
}
public function __isset($property){
if(isset($this->__data[$property])){
return true;
}else{
return false;
}
}
public function __unset($property){
if(isset($this->__data[$property])){
return unset($this->__data[$property]);
}else{
return false;
}
}
}
$test = new person;
$test->email= 'test';
var_dump($test->email);
注意:
这两个方法只会捕捉缺少的属性,如果你为你的类定义了一个属性,那么当访问这个属性时php不会调用__get()和__set();
这两个方法完全破坏了任何属性继承的想法。如果父对象中有个 __get()方法,而你在子类中又实现了自己的__get()方法,那么你的对象不会正确的执行,因为父类的__get()方法永远不会被调用,当然可以用parent::__get()解决
缺点:
速度相对较慢
使用魔术访问器方法就不可能在使用反射类,如phpdocumentor这类的工具将代码自动文档化
不能将其用于静态属性
下一篇: 现在网络流行语.想不笑都难
推荐阅读
-
浅析php设计模式之数据对象映射模式
-
PHP面向对象之旅:深入理解static变量与方法
-
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
-
php面向对象的方法重载两种版本比较
-
PHP学习记录之面向对象(Object-oriented programming,OOP)基础【类、对象、继承等】
-
PHP学习记录之面向对象(Object-oriented programming,OOP)基础【接口、抽象类、静态方法等】
-
php面向对象中的魔术方法中文说明
-
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
-
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
-
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定