返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php中有没有构造函数
  • 515
分享到

php中有没有构造函数

php 2020-02-23 21:02:54 515人浏览 绘本
摘要

本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php中有没有构造函数?php 构造函数__construct(mixed ...$values = ""): voidphp 允许开发者在一个类中定

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

php中有没有构造函数?

php 构造函数

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

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

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

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

<?php
class 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 使用构造器参数

<?php
class 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 使用构造器属性提升

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

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

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

注意:

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

注意:

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

Static 创造方法

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

示例 #4 使用 static 创造方法

<?php
class 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 方法展示了对象以不同方式的实例化方式。

  • fromBasicData() 把所需的全部参数传入构造器,创建对象并返回结果。

  • fromJson() 接受 JSON 字符串,,预处理成构造器所需的格式,然后返回新的对象。

  • fromXml() 接受 XML 字符串并解析,然后创建一个单纯的对象。 由于参数都是可选的,使得可以忽略所有参数去调用构造器。然后为对象的属性赋值后返回结果。

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

--结束END--

本文标题: php中有没有构造函数

本文链接: https://lsjlt.com/news/1174.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • php中有没有构造函数
    本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑php中有没有构造函数?php 构造函数__construct(mixed ...$values = ""): voidPHP 允许开发者在一个类中定...
    99+
    2020-02-23
    php
  • go语言有没有构造函数
    这篇文章主要介绍“go语言有没有构造函数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go语言有没有构造函数”文章能帮助大家解决问题。go语言没有构造函数。go语言作为结构化的语言是没有面向对象语言...
    99+
    2023-07-05
  • php有没有mysql_connect函数
    本文操作环境:Windows10系统、PHP7.1版、Dell G3电脑。php有没有mysql_connect函数mysql_connect() 函数打开非持久的 MySQL 连接。语法mysql_connect(server,user,...
    99+
    2020-02-29
    php
  • php有没有main函数
    这篇文章主要讲解了“php有没有main函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php有没有main函数”吧!PHP中没有main函数;该函数常用于java与C语言中,又被称为主函...
    99+
    2023-07-02
  • PHP 中的构造函数
    在本文中,我们将介绍 PHP 构造函数。我们将看到如何使用 __construct() 函数来初始化类中实例的属性。 我们还将使用该函数来初始化类中具有给定参数的对象的属性。 最后,我们将看到如...
    99+
    2024-02-27
  • python中构造函数有什么用
    python中构造函数的作用有以下几点构造函数主要用于在类的对象创建时定义初始化的状态,它没有返回值,也不能用void来修饰。构造函数可以给创建的对象建立一个标识符。构造函数可以为对象数据成员开辟内存空间。构造函数可以完成对象数据成员的初始...
    99+
    2024-04-02
  • PHP中构造函数的使用原则有哪些
    PHP中构造函数的使用原则有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。构造函数是PHP中总要的基本语法,什么是构造函数呢?我们这里就一起来看看PHP构造函数。如果你...
    99+
    2023-06-17
  • php有没有mb_substr()函数
    这篇文章主要介绍“php有没有mb_substr()函数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php有没有mb_substr()函数”文章能帮助大家解决问题。php有mb...
    99+
    2023-07-04
  • Python构造函数有哪些
    Python中的构造函数是__init__函数Python中子类如果定义了构造函数,父类的构造函数是不会执行的。__init__函数使用方法:class A:def __init__(self, name):self.name = name...
    99+
    2024-04-02
  • C++中构造函数和析构函数有什么作用
    构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的数据成员。构造函数的作用是初始化对象的状态,为对象的数据成员赋初值,确保对...
    99+
    2024-03-11
    C++
  • php有没有补0的函数
    本文操作环境:Windows10系统、PHP7.1版、Dell G3电脑。php有没有没有补0的函数在php中有两个函数——至少有两个是否有其他的我还不知道,能够实现数字补零,str_pad(),sprintf()详细如下str_pad顾名...
    99+
    2019-08-29
    php
  • php没有main函数吗
    PHP中没有main函数;该函数常用于java与C语言中,又被称为主函数,作为绝大部分C程序唯一的入口,是要求有返回值的,返回0代表程序正常执行成功,返回非0值代表程序异常结束;而在PHP中不存在该函数。本文操作环境:Windows10系统...
    99+
    2022-06-16
    php
  • C#中的构造函数有什么作用
    在C#中,构造函数用来初始化对象的实例变量和执行任何必要的初始化操作。当创建一个对象时,构造函数会在对象被实例化之后立即调用。构造函...
    99+
    2024-03-06
    C#
  • javascript中有没有split函数
    这期内容当中小编将会给大家带来有关javascript中有没有split函数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 javascrip...
    99+
    2024-04-02
  • JavaScript中有没有memset函数
    小编给大家分享一下JavaScript中有没有memset函数,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! JavaScript中没有memset()函数;m...
    99+
    2024-04-02
  • javascript中有没有main函数
    这篇文章主要讲解了“javascript中有没有main函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript中有没有main函数”吧! ...
    99+
    2024-04-02
  • linux中有没有access函数
    这篇“linux中有没有access函数”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux中有没有access函数”文...
    99+
    2023-06-30
  • PHP中构造函数如何使用
    这篇文章将为大家详细讲解有关PHP中构造函数如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。PHP经过长时间的发展,很多用户都很了解PHP了,这里我发表一下个人理解,和大家讨论讨论。大...
    99+
    2023-06-17
  • java构造函数的特点有哪些
    Java构造函数的特点有以下几点:1. 构造函数的名称必须与类名完全相同,且没有返回类型,包括void类型。2. 构造函数在创建对象...
    99+
    2023-08-31
    java
  • c#构造函数的作用有哪些
    C#构造函数的作用有以下几个方面: 初始化对象的数据成员:构造函数可以在对象创建时对数据成员进行初始化,确保对象在使用之前拥有合...
    99+
    2024-02-29
    c#
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作