范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。
1、:: 的语法用于静态变量和方法,或者常量。其实也就是用于获取类的数据。
这句话反之也是成立的。获取类的数据,必须使用 :: 获取
2、类与对象是不同的,对象是需要实例化的。可以实例化的地方才可以使用 $this 变量。
3、静态方法不可以访问普通属性,因为这些属性属于对象,而不属于类
4、只有在使用 parent 关键字调用方法时,才能对一个非静态方法进行静态形式的调用。
5、static 并不意味着其中的方法或属性必须是静态的,只不过说明它属于特定的类
根据定义,我们不能再对象中调用静态方法和属性,因此静态元素又被称为类变量和属性,因此我们不能再静态方法中使用伪变量 $this
class Person
{
const SEX = 'man';
private $name = 'test';
public static function getName()
{
// 在静态方法里面不可以获取 getAge $name 属性和方法,因为 getName() 是在类里可以获取的方法,
// 但是getAge $name 是在对象里获取到的方法和属性,对象是需要实例化的
return 'test';
}
public function getAge()
{
echo self::getName(); // getName() 是静态方法,是在类里可以获取到的
echo self::SEX; // SEX 是常量,是在类里面定义的
}
public function test()
{
echo $this->name;
echo self::SEX;
}
public function getThis()
{
var_dump($this);
}
public static function getStaticThis()
{
// 会报错
var_dump($this);
}
}
echo Person::SEX; // man
$person2 = new Person();
$person1 = new Person();
$person = new Person();
$person->getAge(); // test man
$person->test(); //test man
$person->getThis(); // object(Person)#3
$person->getStaticThis(); // Fatal error: Uncaught Error: Using $this when not in object context in /Users/long/php/test/index.php:35 Stack trace: #0 /Users/long/php/test/index.php(46): Person::getStaticThis()
图片.png
在类中,可以使用,self::method() 或者 $this->method(),但是不可以对属性使用此种方式。
class Person
{
const SEX = 'man';
public $name = 'test';
public function getAge()
{
return '12';
}
public function getThis()
{
var_dump(self::getAge());
var_dump($this->getAge());
var_dump($this::getAge());
}
public function getName()
{
// 不可以使用这种方式
var_dump(self::$name);
}
}
$person = new Person();
$person->getThis();
$person->getName(); // 报错
图片.png