PHP7支持类属性的类型暗示吗?

我的意思是,不只是setters/getters美元,还有房产本身.

比如:

class Foo {
    /**
     *
     * @var Bar
     */
    public $bar : Bar;
}

$fooInstance = new Foo();
$fooInstance->bar = new NotBar(); //Error

推荐答案

PHP 7.4 will support typed properties如下所示:

class Person
{
    public string $name;
    public DateTimeImmutable $dateOfBirth;
}

PHP7.3及更早版本不支持此功能,但也有一些替代方案.

您可以创建只能通过具有类型声明的getter和setter访问的私有属性:

class Person
{
    private $name;
    public function getName(): string {
        return $this->name;
    }
    public function setName(string $newName) {
        $this->name = $newName;
    }
}

您还可以创建一个公共属性并使用docblock向阅读代码并使用IDE的用户提供类型信息,但这不提供运行时类型判断:

class Person
{
    /**
      * @var string
      */
    public $name;
}

实际上,您可以将getter和setter与docblock结合起来.

如果你更喜欢冒险,你可以用__get, __set, __isset and __unset magic methods做一个假的属性,然后自己判断类型.不过,我不确定我是否会推荐它.

Php相关问答推荐

如果活动订阅者的购物车中有订阅项目,则在WooCommerce签出中显示通知

根据用户组或登录状态显示或隐藏定价后添加的文本

从WooCommerce Checkout Country Select2下拉列表中重新排序国家/地区

如何优化-PHP 7.3.14+Laravel 6

将一个按钮添加到WooCommerce产品的管理视图中,该按钮链接到一个自定义的WebHook,并在末尾附加产品ID

未收到Strava WebHook事件数据

限制联系人页面仅允许在WooCommerce中登录的用户

如何使用PHP从TXM(XML)标记中读取特定属性

HTTPPost请求在从php脚本调用时返回404,但在从node.js脚本调用时有效.终结点有效

防止 WooCommerce 在前端加载全尺寸图像

在 PHP 中将字符串分解为数组(字符串类似于 WP 短代码)

WooCommerce 以编程方式添加的费用不会持续存在

在 DateTime 或 DateTimeImmutable 对象上调用modify() 时是否必须使用空格?

循环中未序列化数组显示的问题

如何故意创建不同的错误(404,500,419)? Lavravel PHP

PHP 日期格式:ISO8601 与 ISO8601_EXPANDED

Laravel 10 单元测试看不到来自 Artisan Command 的数据库更改

我想更新表格中的结果并将它们发布到浏览器,但它不起作用

一个php应用程序可以实例化多个RNG吗

如何将在同一台服务器上运行的 2 个 PHP 应用程序与使用公共会话分开