概念:屬性宣告是由關鍵字 public,protected 或者* private* 開頭,然後跟一個普通的變數宣告來組成。屬性中的變數可以初始化,但是初始化的值必須是常數,這裡的常數是指 PHP 指令碼在編譯階段時就可以得到其值,而不依賴於執行時的資訊才能求值。
備註:
為了向後相容 PHP 4,PHP 5 宣告屬性依然可以直接使用關鍵字 var 來替代(或者附加於)public,protected 或 private。但是已不再需要 var 了。在 PHP 5.0 到 5.1.3,var 會被認為是廢棄的,而且丟擲 E_STRICT 警告,但是 5.1.3 之後就不再認為是廢棄,也不會丟擲警告。
如果直接使用 var 宣告屬性,而沒有用 public,protected 或 private 之一,PHP 5 會將其視為 public
訪問:
- 在類的成員方法裡面,可以用 ->(物件運算子):$this->property(其中 property 是該屬性名)這種方式來訪問非靜態屬性。靜態屬性則是用 ::(雙冒號):self::$property 來訪問
- 當一個方法在類定義內部被呼叫時,有一個可用的偽變數 $this。$this 是一個到主叫物件的引用(通常是該方法所從屬的物件,但如果是從第二個物件靜態呼叫時也可能是另一個物件)。
Example 1:屬性宣告
class SimpleClass
{
public $var1 = 'hello'.'world';
public $var2 = <<<EOT
hello world
EOT;
public $var3 = 1 + 2;
// public $var4 = self::myStaticMethod();
// public $var5 = $myVar;
// public $var6 = myConstant;//得預先定義這個常量才能執行
public $var7 = array(true, false);
public $var8 = <<<'EOT'
hello world
EOT;
}
$sim = new SimpleClass();
echo $sim->var1."\n";//helloworld,官網上說錯誤的屬性宣告(我用的是PHP5.6執行出來的結果)
echo $sim->var2."\n";//hello world,官網上說錯誤的屬性宣告
echo $sim->var3."\n";//3,官網上說錯誤的屬性宣告
var_dump($sim->var7)."\n";
/*
array(2) { [0] => bool(true) [1] =>bool(false)}
*/
echo $sim->var8."\n";//hello world
跟 heredocs 不同,nowdocs 可在任何靜態資料上下文中使用,包括屬性宣告
Example 2:使用 nowdoc 初始化屬性class foo { // 自 5.3.0 起 public $bar = <<<'EOT' bar EOT; }
挖掘:heredoc和nowdoc的區別
Example 3:heredoc解析變數,nowdoc不解析變數$var1 = '123'; $var2 = <<<EOT $var1 EOT; $var3 = <<<'nowdoc' $var1 nowdoc; echo $var2, PHP_EOL;//123 echo $var3;//$var1
Example 4:heredoc 結構不能用來初始化類的屬性
class TestHereDoc { public $var1 = '123'; //編輯器出現紅色下劃線了 public $var2 = <<<heredoc $var1 heredoc; } class TestNowDoc { public $var1 = '123'; public $var2 = <<<'nowdoc' $var1 nowdoc; } $heredoc = new TestHereDoc(); echo $heredoc->var2, PHP_EOL;//報錯 $nowdoc = new TestNowDoc(); echo $nowdoc->var2;//$var1
總結:
nowdoc 結構可以用在任意的靜態資料環境中,最典型的示例是用來初始化類的屬性或常量
heredoc 是一種專門處理大段字串的通用處理方案,而nowdoc 是php為了彌補動態實現heredoc 的效率問題而實現的“高效率”的靜態版本
heredoc 解析變數, nowdoc 不解析變數
heredoc 結構不能用來初始化類的屬性
本作品採用《CC 協議》,轉載必須註明作者和本文連結