php 7.1未改变public方法的访问规则:public实例方法必须通过对象调用($obj->method()),不可用::调用;仅public static方法才支持classname::method(),因实例方法依赖$this上下文。

public 方法在类外部访问,和 public 类常量是两回事——你问的是方法,不是常量。
PHP 7.1 并没有改变 public 方法的访问规则。它本来就支持且一直支持:只要方法声明为 public,就能通过对象实例调用,**不能**通过 :: 操作符直接调用(除非是静态方法)。
怎么在类外部调用 public 实例方法
必须先实例化对象,再用 -> 调用:
-
public实例方法只能通过对象调用:$obj->methodName() - 直接写
ClassName::methodName()会报错:Fatal error: Uncaught Error: Non-static method ... cannot be called statically - 如果真想用
::调用,得把方法声明为public static,但那就不是“实例方法”了
常见错误:混淆实例方法和静态方法
看到 MathUtils::PI 这种写法,容易误以为所有 public 成员都能这么用。但常量和静态方法支持 ::,普通方法不支持。
- ✅ 正确(实例方法):
$math = new MathUtils(); $math->getPi(); - ❌ 错误:
MathUtils::getPi();→ 报Non-static method cannot be called statically - ✅ 正确(静态方法):
public static function getPi() { return self::PI; },然后才能MathUtils::getPi()
为什么不能直接用 :: 调用 public 实例方法
因为实例方法依赖 $this,而 :: 调用时没有对象上下文,$this 为 null,PHP 会拒绝执行。
- 即使方法内部没用到
$this,PHP 也不允许绕过语义约束 - 这不是版本限制,而是语言设计原则——从 PHP 5 到 8.x 都一致
- PHP 7.1 对类常量加了
public/protected/private,但对方法的可见性规则完全没改动
public 只管“能不能访问”,不管“怎么访问”**。访问方式(-> 还是 ::)由是否 static 决定,不是由 public 决定。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











