PHP 手册 (类与对象) 学习笔记二:属性
概念:属性声明是由关键字 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 协议》,转载必须注明作者和本文链接