PHP 手冊 (類與物件) 學習筆記二:屬性

小彭友發表於2020-05-26

概念:屬性宣告是由關鍵字 publicprotected 或者* 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 協議》,轉載必須註明作者和本文連結

相關文章