什么东西学的再好,不用总会忘记,复习下...
Simple Example
public、protected、private、__get、__set:
- public 表示全局,类内部外部子类都可以访问
- protected表示受保护的,只有本类或子类或父类中可以访问
- private表示私有的,只有本类内部可以使用,在子类内也不可以访问
- 父类的成员,无论是public、protected或private,在子类内都可以覆盖。但子类的访问权限必须高于或等于父类,即父类为protected,子类该成员必须为protected或public。访问权限public > protected > private
- __get($var):当访问private、protected或不存在的成员变量时,会调用该函数,public则不会。
- __set($var, $val):第一个参数变量名,第二个参数变量值。当为private、protected或不存在的变量设置值时,会调用该函数,public则不会。
class T{ private $a = 10; private $b = 100; protected $c = 1; public function __get($n){ echo $n; } public function __set($n, $v){ echo $n . '-' . $v; } public function usechild(){ $this->show(); } public function getName(){ return 'T'; } } class M extends T{ public $d = 1000; public function show(){ echo $this->d . '-' . $this->c; } public function getName(){ return 'M'.parent::getName(); } } class N { public function getName(){ return M::getName(); } } // __get() __set() $t = new T(); $t->a; //'a' $t->c = 'value'; // 'c-value' // extends $m = new M(); $m->usechild(); //1000-1 // overload $n = new N(); echo $n->getName(); //'MT'
abstract
- 类中至少有一个抽象方法
- 抽象方法前需要加abstract
- 抽象方法无需{}
- 继承后重载的方法,必须同抽象方法的参数个数相同
- 本身都不能被实例化,必须被继承
- 继承后,需要把所有抽象方法重载在才可使用
abstract class C1{ abstract function fun1(); abstract function fun2($n, $v); } class C2 extends C1 { public function fun1(){} public function fun2($a, $b){ //参数书目必须一致 return $a . $b; } } $c2 = new C2();
static const final
- static 通过self访问, 可在static fun 或 普通函数中访问
- const 通过self访问, 可在static fun 或 普通函数中访问
- static fun 不能访问非static或const变量
class S{ static $n = 1; public $m = 10; const J = 100; public function getj(){ echo self::J ; } static function getm(){ echo $this->$m; // $s = new S(); $s->getm(); // 'error' // 访问不到非static const变量 // 想象JS就OK了 } static function getn(){ echo self::$n; echo self::J ; } } echo S::$n; //1 S::getn(); //1 $s = new S(); $s->getj();
interface
- 类中全部为抽象方法
- 方法前不需要加abstract
- 接口抽象方法必须为public
- 成员属性必须为常量
- 本身都不能被实例化,必须被继承或者引用
- 继承或引用,需要把所有抽象方法重载才可使用
- 方法无需{}
- 继承后重载的方法,必须同抽象方法的参数个数相同
interface I{ const N = 1; function fun($n, $v); function fun2(); } class II implements I { function fun($a, $b){} function fun2(){} } $ii = new II();
多态
语言具有根据对象的类型不同,使用不同方式的处理
instanceof:用来测定一个给定对象是否来自制定的类
class A{} class B extends A{} $b = new B(); if($b instanceof A){ echo 'A'; // 'A' } if($b instanceof B){ echo 'B'; // 'B' }
其他细节
- 普通的成员方法如果定义的名字和类名相同,那么就变成构造方法