PHP 手册 (类与对象) 学习笔记二:属性

概念:属性声明是由关键字 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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!