2013-12-19 73 views
4

仍試圖找出PHP5中的oop。問題是,如何從擴展類的方法訪問父類的靜態變量。下面的例子。PHP:從擴展類的方法訪問父級的靜態變量

<?php 
error_reporting(E_ALL); 
class config { 
    public static $base_url = 'http://example.moo'; 
} 
class dostuff extends config { 
    public static function get_url(){ 
     echo $base_url; 
    } 
} 
dostuff::get_url(); 
?> 

我認爲這將從其他語言的經驗工作。

回答

6

這是完全不相干的屬性在父聲明,您訪問的方式訪問任何靜態屬性:

self::$base_url 

static::$base_url // for late static binding 
4

是的,這是可能的,但實際上應該這樣寫:

class dostuff extends config { 
    public static function get_url(){ 
     echo parent::$base_url; 
    } 
} 

但在這種情況下,你可以用self::$base_urlstatic::$base_url訪問它都 - 因爲你不伸出類重新聲明這個屬性。你都做到了的話,就不會有一個區別:

  • self::$base_url總是指財產在該行的書面同一類,
  • static::$base_url到類的屬性對象所屬的(所以稱爲「後期靜態綁定」)。

考慮這個example

class config { 
    public static $base_url = 'http://config.example.com'; 
    public function get_self_url() { 
    return self::$base_url; 
    } 
    public function get_static_url() { 
    return static::$base_url; 
    } 
} 
class dostuff extends config { 
    public static $base_url = 'http://dostuff.example.com'; 
} 

$a = new config(); 
echo $a->get_self_url(), PHP_EOL; 
echo $a->get_static_url(), PHP_EOL; // both config.example.com 

$b = new dostuff(); 
echo $b->get_self_url(), PHP_EOL; // config.example.com 
echo $b->get_static_url(), PHP_EOL; // dostuff.example.com 
+0

當我有代表時,我會upvote這個。另一個答案更清晰,因爲當繼承是一個長鏈時,它避免了向父母的父母打電話。 – Eddie

+0

謝謝你的例子。我瞭解了後期的靜態綁定。 –