PHP面向对象的一些深入理解
1.$this就是这个对象的地址,$this不能在类外部使用.
2.构造函数 __construct 和析构函数都没有返回值;一旦一个对象成为垃圾对象(没有任何变量引用的对象,或者=null),析构函数 __destruct就会立即调用。析构函数不能传参数。
3.全局变量 global $a 在程序中都可以使用的变量(非面向对象)。
4.静态变量 public static $a 一个类的所有对象共享的变量(面向对象)。[类外访问] 类名::$a; [类内访问] 类名::$a 或者 self::$a
5.静态方法 public static function static_func_name(){ } 属于所有对象实例,静态方法只能操作静态变量;非静态方法既可以操作静态变量,也可以操作非静态变量。[类外访问] 类名:: static_func_name(); 或者 对象名-> static_func_name(); [类内访问] 类名:: static_func_name() 或者 self:: static_func_name()
6.关于访问修饰符:public(全局、继承类、本类);protected(继承类、本类);private(本类)。
7.继承 extends:子类默认不会调用父类的构造函数。[子类访问父类的方法(包括构造函数)] 父类::方法名(); 或者 parent::方法名(); 如果子类的方法和父类方法相同,称为 方法重写(或者叫:方法覆盖)。多态的体现:当子类没有覆盖父类的方法则调用父类的方法,当子类覆盖了父类的方法,则调用自己的方法。
8. 方法重载 overload(定义多个同名函数,我认为没这个必要),php5 默认不直接支持方法重载,使用__call魔术方法,模拟方法重载的效果。
9. 抽象类(可以是public/protected/private)和抽象方法是当父类的一些方法不能确定时会用到。抽象类 abstract class Obj{}; 抽象方法不能有方法体 abstract public function func_name(param1,...); 抽象类中可以没有抽象方法,但是抽象方法必须存在于抽象类中!如果A1类继承了一个抽象类 A,则要求A1类实现从A类继承的所有抽象方法
10.接口(更加抽象的抽象类,接口的方法都不能有方法体且必须是public,不能去实例化接口)。interface iJK{},class 类名 implements iJK,iJK2{}。接口中可以有属性,但是必须是常量,并且是public。 interface iUsb{ const A=90; //如果是 $a=90; 就会出错 } //要取到属性:iUsb::A; 一个接口不能继承其他的类,但是可以继承别的接口。一个接口可以继承多个其它的接口.当一个类去实现了某些接口,则必须把所有接口的方法都实现。 一个类可以同时继承他的父类,而且实现接口: class A1 extends A implements iUsb2,iUsb3{…}
11.final关键字:修饰类 或者 方法,不能修饰属性。 ① 希望某个类不能被继承: final class A{} ② 希望某个方法不能被子类重载(改写): class A{final public function func_name(){} }
12.const关键字:类中的常量。class 类名{const 常量名(大写)= 赋初值; } interface 接口名{const 常量名(大写)= 赋初值;} [调用方法]类名::常量名; 接口名::常量。在类的内部也可以使用 self::常量。
13.使用instanceof检测当前对象是否属于一个类的实例,返回布尔。get_class() 函数返回对象所属类的名字,如果不是对象则返回false。
[类的组合与继承]
1. 继承和多态都是对类进行复用,继承是类级别的复用,多态是方法级别的复用。
2. 子类继承父类的属性和方法,称为继承。
3. 在继承中,用parent指代父类,用self指代自身,用“:” 运算符(范围解析操作符)调用父类的方法。
4. 静态:如果声明类成员或方法为static,就可以不实例化类而直接访问,也不能用“:”访问一个非静态方法,如果这样会导致E_STRICT 级别的错误。php.ini: error_reporting=E_ALL | E_STRICT display_errors=On
5.继承最大的优点是扩展简单,但是其缺点大于优点。一般继承树不要多于三层。若要禁止被继承,使用final修饰符。
[接口 interface]
1. PHP 中接口的语义是有限的,使用接口的地方并不多,可以更多的使用抽象类。
2. SPL(标准PHP库),实现一些接口,最主要的就是iterator迭代器接口。
3. toString方法就是接口的一种变相实现;Traits可以被视为一种加强型的接口。
4. 接口只是一个声明,一旦使用interface关键字,就应该实现它。
[反射 ReflectionClass]
1.使用class函数返回对象属性的关联数组:
① get_object_vars($obj); //返回对象属性的关联数组
② echo get_class($obj); //获取对象属性列表所属的类
③ get_class_vars(get_class($obj)); //类属性
④ get_class_methods(get_class($obj)); //返回由类的方法名组成的数组
2. 反射完整的描述了一个类或者对象的原型,不仅可以用于类和对象,还可以用于函数、扩展模块、异常。
3. 反射的消耗很大,能找到替代方案的情况下就不要滥用。
【单例模式】
<?php class demo{ private static $MyObject ; //保存对象的静态属性 private function __construct(){} //私有化构造函数 private function __clone(){} //禁止克隆 public static function getInstance(){ if(!(self::$MyObject instanceof self)){ self::$MyObject = new self; } return self::$MyObject; } } ?>
【魔术常量】
class moshu{ function __construct(){ echo "<br>".__LINE__; //当前的行数 echo "<br>".__FILE__; //当前文件绝对路径及文件名 echo "<br>".__DIR__; //当前文件绝对路径 echo "<br>".__CLASS__;//当前的类名 echo "<br>".__FUNCTION__; //当前的函数(方法)名 echo "<br>".__METHOD__; //类的方法名 echo "<br>".__NAMESPACE__; //命名空间[不常用] } } $ms=new moshu();