
PHP定义类的基本语法长什么样
PHP里定义类就是用 class 关键字加一对花括号,类名首字母大写是惯例(不是强制),但不遵守会导致和PSR-4自动加载冲突。
- 类名必须是合法标识符,不能是数字开头,不能含空格或特殊符号
- 类体里可以放属性(
public、private、protected修饰)、方法、常量,也可以为空 - 类定义不带分号结尾,写成
class Foo { };会报Parse error: syntax error
最简可用示例:
class User
{
public string $name;
public function greet(): string
{
return 'Hello, ' . $this->name;
}
}
属性和方法的可见性怎么选
PHP中 public、protected、private 不只是“能不能访问”的问题,它直接影响继承行为和测试友好度。
-
public:外部可读可写,适合明确暴露的接口属性(如DTO对象的字段),但滥用会让类状态失控 -
protected:子类能访问,父类方法也能操作,适合需要被继承扩展的内部状态 -
private:仅当前类可用,重构安全,但过度使用会让单元测试难打桩(比如想 mock 某个私有方法逻辑时只能绕路) - PHP 8.2+ 支持只读类(
readonly class),配合public readonly属性可防意外修改,比全用private+ getter 更轻量
构造函数__construct里该做哪些事
__construct 是对象初始化的入口,但不是所有初始化逻辑都该塞进去——它该专注“让对象进入可用状态”,而不是执行副作用。
何利用jQuery插件leanModal建立一个常规模态窗口。如果你有MIT general license,那么这个插件是完全开源和免费的,我很喜欢这个插件,用起来相当方便,还能自行添加CSS,达到自定义的效果。
立即学习“PHP免费学习笔记(深入)”;
- 推荐只做:参数校验、属性赋值、依赖注入(如传入
LoggerInterface)、必要资源预分配(如打开一个已知路径的文件句柄) - 避免做:远程API调用、数据库查询、文件IO(除非路径/内容完全确定且极轻量),这些会让实例化变慢且不可测
- 如果构造时必须处理异常(比如配置缺失),直接 throw,别静默失败;否则后续调用
$obj->doSomething()才爆错,堆栈更难追 - PHP 8.0+ 支持构造函数属性提升(constructor property promotion),能把参数声明和属性声明合并,减少样板代码
例如:
class ApiClient
{
public function __construct(
private string $baseUrl,
private ?LoggerInterface $logger = null
) {
if (empty($this->baseUrl)) {
throw new InvalidArgumentException('baseUrl cannot be empty');
}
}
}
类定义后为什么new User()还是报错
常见不是语法错,而是环境或上下文问题。先确认是不是这几类:
- 类没被加载:PHP不会自动找文件,
class User定义在User.php里,但没require或没走 autoloader,就会报Class 'User' not found - 命名空间没对齐:定义了
namespace App\Models;,但实例化时写了new User()而不是new App\Models\User()或用了use App\Models\User; - PHP版本太低:用了
string类型声明,但 PHP readonly,但 PHP - 类名大小写敏感:Linux服务器上
class user和new User()是两个东西,Windows不报但部署就挂
查错优先看完整错误信息里的 Class 'xxx' not found 或 ParseError 行号,别只盯着 new 那行。










