【问题标题】:PHP type hinting error?PHP类型提示错误?
【发布时间】:2013-01-17 20:31:49
【问题描述】:

我刚刚遇到了这个致命错误

可捕获的致命错误:传递给 File::__construct() 的参数 1 必须是整数的实例,整数给定,在第 9 行的 /home/radu/php_projects/audio_player/index.php 中调用并在 /home/ 中定义radu/php_projects/audio_player/php/File.php 在第 7 行

所以,有课

class File{        
        public $id;
        public $name;
        public $file_paths;
        public function __construct(integer $id=null, string $name=null, array $file_paths=null)
        {
            foreach(func_get_args() as $name => $val)
            {
                $this->$name = $val;
            }
        }
    }

这是触发错误的代码

$file = new File(1, "sound", array());

我是否遗漏了什么或者这个 PHP 类型提示有什么不好的地方?

【问题讨论】:

  • PHP 不支持简单类型的提示 - 仅支持命名类和接口,stdClassarray 和(最新版本)callable
  • 不相关,但您可能希望将这些属性从public 更改为protected,因此它们被类封装。
  • 哦,那不是很好..关于公共属性 - 我不打算创建设置器,这样我可以轻松更改实例的状态..
  • 如果不了解整个类以及它的使用(和将会)有多么重要,就很难回答有关封装的问题。它肯定会起作用,但我的观点总是从尽可能好的设计开始 - 危险是你会从说“公共属性适合小类”开始,然后它会变成一个大类,你最终会得到更难维护的技术债务。但是,这取决于你!
  • 那篇 Google 文章在性能方面肯定是正确的,但对于大型系统来说,这不是很好的建议,imo。

标签: php php-5.3 type-hinting


【解决方案1】:

因为这可能会产生误导,而且这个答案在搜索引擎中仍然很高。

PHP 7 确实为标量类型引入了类型提示

PHP 5 中没有标量类型提示,因此integer 类型提示被认为是类类型提示。

更多参考http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration

【讨论】:

    【解决方案2】:

    据我所知,您不能在 PHP 中使用整数类型提示。然而,PHP.net 中的某个人提出了这条有用的评论:

    http://www.php.net/manual/en/language.oop5.typehinting.php#83442

    如果您确实需要此功能,这显然是一种适合您的解决方法。

    【讨论】:

      【解决方案3】:

      您不能强制参数为整数。

      看这里language.oop5.typehinting

      PHP 5 引入了类型提示。函数现在能够强制参数为对象 [...]、接口、数组(自 PHP 5.1 起)或可调用(自 PHP 5.4 起)。

      [...]

      类型提示不能用于标量类型,例如 int 或 string。 [...]

      这里language.types.intro,PHP 标量类型是:

      - 布尔值 - 整数 - float(浮点数,又名双精度) - 细绳

      【讨论】:

        猜你喜欢
        • 2021-02-17
        • 1970-01-01
        • 2019-01-23
        • 2021-07-28
        • 2013-06-06
        • 1970-01-01
        • 2017-11-21
        • 2013-02-17
        • 1970-01-01
        相关资源
        最近更新 更多