技術(shù)頻道導航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務器技術(shù)
操作系統(tǒng)
網(wǎng)站運營

贊助商

分類目錄

贊助商

最新文章

搜索

PHP中self和this的用法區(qū)別

作者:admin    時間:2016-8-3 9:46:27    瀏覽:

PHP支持類和面向?qū)ο蠼Y(jié)構(gòu),PHP的類的靜態(tài)函數(shù)和變量不與任何特定類的實例相關聯(lián)(換句話說,一個對象)。請看:類與對象的區(qū)別。

相反,靜態(tài)函數(shù)和變量與類定義本身相關聯(lián)。換言之,一個類的所有實例都共享相同的靜態(tài)變量。在一個類的方法(函數(shù))的上下文中,靜態(tài)變量和函數(shù)被訪問使用self::,在一個類的對象(實例)的上下文中使用其他方法和變量時用this。

比較表

  self this
能在靜態(tài)函數(shù)里使用
可訪問的類變量和方法由 self:: $this-> (注意:PHP > 5.3 允許由 $this 使用靜態(tài)變量,用 $this::$foo。 $this->foo 將仍然沒有被定義,如果 $foo 是一個靜態(tài)變量.)
需要一個實例對象

PHP中self和this的實例

class exampleClass
{
    public static $foo;
    public $bar;
    public function regularFunction() { echo $this->bar; }

    public static function staticFunction() { echo self::$foo; }

    public static function anotherStatFn() { self::staticFunction(); }

    public function regularFnUsingStaticVar() { echo self::$foo; }
    
    // 注: PHP 5.3 使用 $this::$bar 代替 self::$bar 是允許的

}

exampleClass::$foo = "Hello";

$obj = new exampleClass();

$obj->bar = "World!";

exampleClass::staticFunction(); /* 打印 Hello */

$obj->regularFunction(); /* 打印 World! */

 靜態(tài)函數(shù)只能使用靜態(tài)變量,靜態(tài)函數(shù)和變量的引用是通過 self::函數(shù)名() 和 self::變量名。上述實例中,靜態(tài)變量的引用是由類名(exampleClass::$foo),或者 self:: (self::$foo),當在這個類的靜態(tài)方法[稱為 靜態(tài)函數(shù)()]里使用時。類的正則函數(shù)和變量需要一個對象上下文來引用,他們不能脫離對象上下文而存在。對象上下文由 $this 提供。在上述函數(shù)中,$bar 是一個正則變量,所以它被 $obj->bar(上下文使用變量obj) 來引用,或者使用 $this->bar(再次在一個對象的方法里在一個對象上下文中) 來引用。

self 不使用前面的 $,因為 self 不意味著是一個變量而是類結(jié)構(gòu)本身。而 $this 引用一個特定的變量,所以有前面的 $ 。

參考:靜態(tài)關鍵詞

聲明類屬性或方法為靜態(tài),就可以不實例化類而直接訪問。靜態(tài)屬性不能通過一個類已實例化的對象來訪問(但靜態(tài)方法可以)。

為了兼容 PHP 4,如果沒有指定訪問控制,屬性和方法默認為公有。

由于靜態(tài)方法不需要通過對象即可調(diào)用,所以偽變量 $this 在靜態(tài)方法中不可用。

靜態(tài)屬性不可以由對象通過 -> 操作符來訪問。

用靜態(tài)方式調(diào)用一個非靜態(tài)方法會導致一個 E_STRICT 級別的錯誤。

就像其它所有的 PHP 靜態(tài)變量一樣,靜態(tài)屬性只能被初始化為文字或常量,不能使用表達式。所以可以把靜態(tài)屬性初始化為整數(shù)或數(shù)組,但不能初始化為另一個變量或函數(shù)返回值,也不能指向一個對象。

自 PHP 5.3.0 起,可以用一個變量來動態(tài)調(diào)用類。但該變量的值不能為關鍵字 self,parent 或 static。

靜態(tài)關鍵詞實例

<?php
class Foo
{
    public static $my_static = 'foo';

    public function staticValue() {
        return self::$my_static;
    }
}

class Bar extends Foo
{
    public function fooStatic() {
        return parent::$my_static;
    }
}

print Foo::$my_static . "\n";

$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n";      // Undefined "Property" my_static

print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n"; // As of PHP 5.3.0

print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>
   </programlisting>
  </example>

  <example>
   <title>靜態(tài)方法示例</title>
    <programlisting role="php">
<![CDATA[
<?php
class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // 自 PHP 5.3.0 起
?>

 

標簽: self  this  
相關文章
    x
    • 站長推薦
    /* 左側(cè)顯示文章內(nèi)容目錄 */