July 21st, 2011

PHP 面向对象(OO)

PHP, by hyperblue.

Simple Example

public、protected、private、__get、__set:

  • public 表示全局,类内部外部子类都可以访问
  • protected表示受保护的,只有本类或子类或父类中可以访问
  • private表示私有的,只有本类内部可以使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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
  • 抽象方法无需{}
  • 继承后重载的方法,必须同抽象方法的参数个数相同
  • 本身都不能被实例化,必须被继承
  • 继承后,需要把所有抽象方法重载在才可使用
1
2
3
4
5
6
7
8
9
10
11
12
13
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变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
  • 成员属性必须为常量
  • 本身都不能被实例化,必须被继承或者引用
  • 继承或引用,需要把所有抽象方法重载才可使用
  • 方法无需{}
  • 继承后重载的方法,必须同抽象方法的参数个数相同
1
2
3
4
5
6
7
8
9
10
11
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:用来测定一个给定对象是否来自制定的类
1
2
3
4
5
6
7
8
9
10
class A{}
class B extends A{}
 
$b = new B();
if($b instanceof A){
    echo 'A';    // 'A'
}
if($b instanceof B){
    echo 'B';    // 'B'
}

其他细节

  • 普通的成员方法如果定义的名字和类名相同,那么就变成构造方法

Back Top

Responses to “PHP 面向对象(OO)”

发表我的评论



Back Top