代码改变世界

php学习小记2 类与对象

2013-11-27 21:45  bootstar  阅读(196)  评论(0编辑  收藏  举报

php类的一些特性:

1. 伪变量$this。$this是一个到主叫对象的引用。取值:该方法所从属的对象,可能是另外的对象(前提,当该方法被静态调用时)。$this变量存在于一个类的非静态方法中,在静态方法中是不存在的。

<?php
class A{
    function f() {
        if( isset($this) ) {
            echo '$this is defined ('.get_class($this).')\n';
        }
        else {
            echo '$this is not defined.\n';
        }
        echo "<br />";
    }
};
class B{
    function g() {
        A::f();
    }
}

$a = new A();
$a->f();
A::f();

$b = new B();
$b->g();
B::g();
?>

结果:

$this is defined (A)\n

Strict Standards: Non-static method A::f() should not be called statically in /var/www/php/this.php on line 21
$this is not defined.\n

Strict Standards: Non-static method A::f() should not be called statically, assuming $this from incompatible context in /var/www/php/this.php on line 15
$this is defined (B)\n

Strict Standards: Non-static method B::g() should not be called statically in /var/www/php/this.php on line 25

Strict Standards: Non-static method A::f() should not be called statically in /var/www/php/this.php on line 15
$this is not defined.\n

其中调用非静态方法时是不允许的,所以这里产生了Strict警告。忽略警告信息,可以看出this的从属关系。

2. new:new className(), 其中className可以用变量代替,这一点上与php中可变函数类似,(对比一下,java中可以用反射机制去动态的创建,C++中比较麻烦,当然只是写起来比较麻烦,代码量比较大。。。)在类内定义时可以采用new self和new parent创建对象。

3. 对象的赋值以及引用:这个跟java比较像,一旦一个对象被创建就会一直驻留(当然会有垃圾回收机制来处理不使用的对象),对于变量的赋值,并不会影响到对象的改变,只是影响变量的值。当然在函数传递对象的时候也是这样的。引用就是将两个或者多个变量进行绑定,无论何时它们的值都是一样的。具体可以参考下面这个例子:

 

<?php
class A{
    public $var = "A";
    function func($name){
        echo "object ".$name." call function func ".$this->var;
        echo "<br />";
    }
};

$var1 = new A();
$var2 = $var1;
$var3 = & $var1;

$var1->func('$var1');
$var2->func('$var2');
$var3->func('$var3');

$var1->var = "A change to B";

$var1->func('$var1');
$var2->func('$var2');
$var3->func('$var3');

$var1 = null;



//$var1->func('$var1');
//$var2->func('$var2');
//$var3->func('$var3');


var_dump( $var1 );
echo"<br />";
var_dump( $var2 );
echo"<br />";
var_dump( $var3 );
echo"<br />";

?>

 

结果:

object $var1 call function func A
object $var2 call function func A
object $var3 call function func A
object $var1 call function func A change to B
object $var2 call function func A change to B
object $var3 call function func A change to B
NULL 
object(A)#1 (1) { ["var"]=> string(13) "A change to B" } 
NULL 

4. extends 继承,不支持多重继承,一个类只能继承一个基类,覆盖:用同名函数或者同名变量,当覆盖方法时参数必须保持一致。父类中final方法不允许覆盖,parent::来访问被覆盖的方法和属性,构造函数除外。

5.属性方法:非静态属性必须标明其访问权限(在php5.4版本下实验),静态属性如果未标明其访问权限,默认情况下为public.

一个特别的地方:同一个类的对象即使不是同一个实例也可以互相访问对方的私有和保护成员

还有一个需要注意的地方:属性的初始化,初始化的值必须在编译阶段可以确定下来,所以必须是常数(不可以是变量的值或者表达式)。

另外一旦属性或者对象被覆盖,那么父类中的属性或者对象在本类中都是不可见的,对于静态的方法或者属性是可以通过parent来调用,其他的方法或者属性不可用。

<?php
class Test{
    private $foo;
    
    public function __construct($foo){
        $this->foo = $foo;
    }

    private function bar(){
        echo 'Accessed the private method.<br />';
    }
    public function baz(Test $other){
        $other->foo = 'hello';
        var_dump( $other->foo );
        echo "<br />";
        $other->bar();
    }

};

$test = new Test( 'test' );
$test->baz( new Test('other') );

?>
string(5) "hello" 
Accessed the private method.

 6. $this, self, parent

$this只能适用于一个非静态方法和属性,静态方法中不存在this。self和parent一样,都是只适用于静态方法和属性的调用,区别在于self是指向自己的静态方法和属性,parent是指向父类的静态方法和属性,调用方式:self::$var/self::func(), parent::$var/parent::func().

7. static静态属性和静态方法不能用对象->来直接调用,静态属性如果未指明其访问权限,默认情况下为public.类常量:必须在编译前确定的值,只能为数值,不是任何的表达式。访问方式:$classname :: constant

8.构造函数和析构函数:构造函数形式__construct(), 析构函数形式__destory()

如果子类中定义了构造函数,那么将不会显式的调用父类中的构造函数,如果未定义,将会继承父类的构造函数并调用,析构函数也是同样的情况。