为什么 PHP 中 this 和 self 访问变量的写法不一样?

self 是关键字,而 $this 是一个变量,表示当前对象,也就是你能直接把 $this 返回实现链式调用.

$this->foo 也是一个变量,表示当前对象里名为 foo 的成员.

而 self::$foo 表示类里面名为 foo 的变量.

self 其实就相当于类名,parent 相当于父类名,都是在类里面使用的关键字.

<?php
class foo {
	const a = '类的常量'; // PHP 5.3
	public static $b = '类的静态变量';
	public $c = '对象的变量';
	// 类的普通方法既能访问静态变量,也能访问普通变量.
	// 而类的静态方法不能访问类的非静态变量和非静态方法.
	public function bar() {
		return array(
			self::a,
			self::$b,
			$this->c
		);
	}
}
$foo = new foo();
echo foo::a  . "\n"; // 类的常量
echo foo::$b . "\n"; // 类的静态变量
echo $foo->c . "\n"; // 对象的变量
var_export($foo->bar()); // 输出:

输出的内容如下:

array (
  0 => '类的常量',
  1 => '类的静态变量',
  2 => '对象的变量',
)