文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

php构造函数怎么使用

2023-06-29 00:44

关注

这篇“php构造函数怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php构造函数怎么使用”文章吧。

php中有构造函数,其语法说明是“__construct(mixed ...$values = ""): void”,具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

php构造函数怎么使用

本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑

php中有没有构造函数?

php 构造函数

__construct(mixed ...$values = ""): void

PHP 允许开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

注意: 如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。

示例 #1 继承中的构造函数

<?phpclass BaseClass {    function __construct() {        print "In BaseClass constructor\n";    }}class SubClass extends BaseClass {    function __construct() {        parent::__construct();        print "In SubClass constructor\n";    }}class OtherSubClass extends BaseClass {    // 继承 BaseClass 的构造函数}// In BaseClass constructor$obj = new BaseClass();// In BaseClass constructor// In SubClass constructor$obj = new SubClass();// In BaseClass constructor$obj = new OtherSubClass();?>

与其它方法不同, __construct() 在继承时不受签名兼容性规则的约束。

自 PHP 5.3.3 起,在命名空间中,与类名同名的方法不再作为构造函数。不使用命名空间中的类则不受影响。 构造函数是一个普通的方法,在对应对象实例化时自动被调用。 因此可以定义任何数量的参数,可以是必选、可以有类型、可以有默认值。 构造器的参数放在类名后的括号里调用。

示例 #2 使用构造器参数

<?phpclass Point {    protected int $x;    protected int $y;    public function __construct(int $x, int $y = 0) {        $this->x = $x;        $this->y = $y;    }}// 两个参数都传入$p1 = new Point(4, 5);// 仅传入必填的参数。 $y 会默认取值 0。$p2 = new Point(4);// 使用命名参数(PHP 8.0 起):$p3 = new Point(y: 5, x: 4);?>

如果一个类没有构造函数,以及构造函数的参数不是必填项时,括号就可以省略。

旧式风格的构造器

PHP 8.0.0 之前,全局命名空间内的类如果有一个同名的方法,则会解析为旧式风格的构造器。 虽然函数能被当作构造器,但该语法已被废弃,并会导致 E_DEPRECATED 错误。 如果 __construct() 和同名方法同时存在时, 会调用 __construct()。

以下两种情况时,与类同名的方法不再有特殊意义:命名空间中的类、PHP 8.0.0 起的任何类。

新代码中要使用 __construct()。

构造器属性提升

PHP 8.0.0 起,构造器的参数也可以相应提升为类的属性。 构造器的参数赋值给类属性的行为很普遍,否则无法操作。 而构造器提升的功能则为这种场景提供了便利。 因此上面的例子可以用以下方式重写:

示例 #3 使用构造器属性提升

<?phpclass Point {    public function __construct(protected int $x, protected int $y = 0) {    }}

当构造器参数带访问控制(visibility modifier)时,PHP 会同时把它当作对象属性和构造器参数, 并赋值到属性。 构造器可以是空的,或者包含其他语句。 参数值赋值到相应属性后执行正文中额外的代码语句。

并非所有参数都需要提升。可以混合提升或不提升参数作为属性,也不需要按顺序。 提升后的参数不影响构造器内代码调用。

注意:

对象属性的类型不能为 callable 以避免为引擎带来混淆。 因此提升的参数也不能是 callable。 其他任意 类型声明 是允许的。

注意:

放在构造器提升参数里的属性会同时复制为属性和参数。

Static 创造方法

在 PHP 中每个 class 只能有一个构造器。 然而有些情况下,需要用不同的输入实现不同的方式构造对象。 这种情况下推荐使用 static 方法包装构造。

示例 #4 使用 static 创造方法

<?phpclass Product {    private ?int $id;    private ?string $name;    private function __construct(?int $id = null, ?string $name = null) {        $this->id = $id;        $this->name = $name;    }    public static function fromBasicData(int $id, string $name): static {        $new = new static($id, $name);        return $new;    }    public static function fromJson(string $json): static {        $data = json_decode($json);        return new static($data['id'], $data['name']);    }    public static function fromXml(string $xml): static {        // 自定义代码逻辑。        $data = convert_xml_to_array($xml);        $new = new static();        $new->id = $data['id'];        $new->name = $data['name'];        return $new;    }}$p1 = Product::fromBasicData(5, 'Widget');$p2 = Product::fromJson($some_json_string);$p3 = Product::fromXml($some_xml_string);

可以设置构造器为 private 或 protected,防止自行额外调用。 这时只有 static 方法可以实例化一个类。 由于它们位于同一个定义的 class 因此可以访问私有方法,也不需要在同一个对象实例中。 当然构造器不一定要设置为 private,是否合理取决于实际情况。

三个 static 方法展示了对象以不同方式的实例化方式。

在以上三个例子中,static 关键词会被翻译成代码所在类的类名。 这个例子中是 Product。

以上就是关于“php构造函数怎么使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯