PHP类方法必须显式声明public/protected/private访问修饰符,缺省即报语法错误;构造等魔术方法强制为public;static方法不可用$this;严格类型需首行声明。

PHP类里的方法不是“函数”的简单搬家,漏写访问修饰符会直接报错,function getName() 这种写法在类里根本通不过解析。
类方法必须带 public/protected/private
PHP强制要求每个类方法显式声明可见性,不写就报 Parse error: syntax error, unexpected 'function'。这不是风格问题,是语法硬约束。
-
public:最常用,外部对象、子类、当前类都能调用 -
protected:当前类和子类可用,外部对象不能直接调用(比如$obj->logAccess()会 fatal) -
private:仅当前类内部能用,连子类都访问不到
错误示范:function getName() { return $this->name; } —— 缺少修饰符,解析失败。
正确写法:public function getName() { return $this->name; }
立即学习“PHP免费学习笔记(深入)”;
__construct 和 __destruct 必须是 public
哪怕你刻意写成 private function __construct(),PHP运行时也会抛出 Fatal error: Constructor __construct() cannot be private。
- 这是PHP底层机制,不是约定,改不了
- 想实现单例?别锁构造函数,改用
private function __construct()+ 静态工厂方法public static function getInstance(),并在构造里加逻辑拦截 -
__clone、__sleep等魔术方法同理,必须public
静态方法不能用 $this,也不能访问非静态成员
static 方法属于类本身,不依赖实例,所以 $this 在里面根本不存在。
- 写
$this->name或$this->doSomething()会触发Fatal error: Using $this when not in object context - 只能访问
self::$staticProp、self::staticMethod()或static::后绑定的静态内容 - 普通方法可以自由混用
$this->prop和self::$staticProp,但反过来不行
示例:public static function getConfig(): array { return self::$config; } ✅;public static function getName() { return $this->name; } ❌
类型声明要注意 declare(strict_types=1) 的开关时机
加了 int $age 或 : string 不代表万事大吉,严格模式开不开,行为天差地别。
- 没开严格模式:
setAge("25")会被静默转成 int 25,可能掩盖数据污染 - 开了严格模式:
setAge(null)直接TypeError;string|null $desc才允许传null -
declare(strict_types=1)只影响当前文件,且必须放在文件首行(除空白和注释外)
最容易被忽略的是:父类方法声明了 : ?string,子类重写时返回 "" 没问题,但返回 null 就得确保签名也带 ?,否则 LSP 违反,PHP 8.1+ 会报错。



















