PHP 7.1起类常量可见性规则:类内部self::始终可读;public外部和子类均可访问;protected仅子类可读、外部直接调用Fatal error;private仅本类可读,不被继承,子类和外部均Fatal error。

要快速记住PHP 7.1起类常量的可见性规则,不能靠死背表格,得抓住三类修饰符在“谁可以读”这件事上的真实行为边界——尤其是子类和外部调用时的报错差异,一旦记混,运行时直接抛Fatal error。
先搞清核心逻辑:类内部永远能读,分歧只在“往外走”
所有修饰符下,类内部用self::都能正常访问,这是唯一无条件成立的前提。真正的记忆锚点在于:当代码离开当前类作用域后,public、protected、private分别在哪一步断掉?
public → 类外部直接MathUtils::PI,通;子类中self::PI,也通。
protected → 类外部MathUtils::MAX_VALUE,立刻Fatal error;但子类AdvancedMath中self::MAX_VALUE,完全合法。
立即学习“PHP免费学习笔记(深入)”;
private → 类外部MathUtils::SECRET_KEY,Fatal error;子类AdvancedMath中self::SECRET_KEY,同样Fatal error——【private常量不会被继承】,这点和private属性/方法一致,但初学者常误以为“子类能继承private常量”。
用生活化场景绑定记忆
把类想象成一家公司:
public常量 = 公司官网公开的客服电话(谁都能查、谁都能打);
protected常量 = 部门经理才知道的内部审批流程编号(本部门可用,子公司对接时也能用,但客户打114查不到);
private常量 = 财务总监保险柜里的原始凭证编号(连副总都无权调阅,更别说外部审计)。
这个比喻里,“子公司”对应子类,“外部审计”对应类外部调用——关键不是“能不能传下去”,而是“有没有权限打开”。
三步验证法:写完立刻测
第一步:在类内部写echo self::XXX; 确保不报错;
第二步:在另一个文件里写echo YourClass::XXX; 如果是protected或private,这行一执行就崩;
第三步:建一个子类,在子类方法里写echo self::XXX; 如果是private,这里也会崩——【只要报错位置不符合预期,说明记反了】。
这三步不需要记口诀,每次定义新常量时顺手跑一遍,三次之后肌肉记忆就形成了。



















