【发布时间】:2018-08-06 00:25:17
【问题描述】:
为什么 PHP 允许使用类名和各种关键字(例如作为类名占位符的 self、static 和 parent)静态调用非静态方法?
但另一方面它不允许调用非静态属性 静态的?
这里是示例代码 -
<?php
# PHP Version 7.1.7
error_reporting(E_ALL);
ini_set('display_errors', 1);
class Fruit {
public $name = 'Fruit';
public function x() {
echo "Fruit_x" . "<br>";
}
}
class Orange extends Fruit {
public $name = 'Orange';
public function x() {
echo "Orange_x" . "<br>";
parent::x();
self::y();
static::z();
// Code Below will throu Uncaught Error: Access to undeclared static property
// echo parent::$name . "<br>";
// echo self::$name . "<br>";
}
public function y(){
echo "Y" . "<br>";
}
public function z(){
echo "Z" . "<br>";
}
}
(new Orange)->x(); // No Warnings
Orange::x(); // However calling like this shows warning as of PHP 5 & 7
// Docs - http://php.net/manual/en/language.oop5.static.php
?>
【问题讨论】:
-
我认为它已被弃用的事实应该给你一些暗示,无论是否允许,你都不应该这样做。
-
令人惊讶的是,在函数内部它没有给出静态访问非静态方法的警告。这反过来又让人感到困惑和难以解释
-
因为您实际上并没有静态访问它们。 parent、self 和 static 足够聪明,可以确定您有一个实例,这些是实例方法。当您没有实例时(当您静态调用 x() 时),您会收到警告
-
但是如果是这样的话,为什么当我回显 parent::$name & self::$name 时它会抛出“未捕获的错误:访问未声明的静态属性”?这些是实例属性
标签: php static static-methods non-static