【问题标题】:How can I define a class that can only be instantiated when no parameters are passed to the constructor?如何定义一个只有在没有参数传递给构造函数时才能实例化的类?
【发布时间】:2019-01-30 06:42:03
【问题描述】:

如何定义一个只能实例化不带参数的类,并在任何参数传递给构造函数时禁止实例化?

我的目标是强制执行一组应该“简单”并用作模板的类。作为其中的一部分,我不希望在实例化期间将 anything 传递给构造函数。

当任何东西通过构造函数传递时,我希望事情失败(运行时错误、致命错误、静态解释器错误检查等)

class Template()
{
    ...
}

new Template(); // okay
new Template($anything); // must not work

【问题讨论】:

    标签: php constructor parameter-passing instantiation


    【解决方案1】:

    如果有任何通过就抛出一个异常:

    class Foo {
        public function __construct(...$args) {
            if (count($args) > 0) {
                throw new Exception('No arguments!');
            }
        }
    }
    

    【讨论】:

    • (注意... splat 运算符 - 仅限 PHP >=5.6,因此请考虑如果您必须支持旧版本 (我希望您不要这样做) )
    【解决方案2】:
    class Test {
    
        public function __construct() {
            if (func_get_args()) {
                throw new Exception('No parameters are allowed.');  
            }
        }
    
    }
    
    try {
        $p = new Test('test');
    } catch (Exception $e) {
        echo $e->getMessage();  
    }
    

    【讨论】:

    • func_num_args() 在这里稍微好一些,因为我们不在乎它们是什么,只要有一些。我考虑过在答案中使用它,但这不是值得另一个答案的区别。
    猜你喜欢
    • 2018-07-27
    • 2023-01-18
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2019-09-29
    相关资源
    最近更新 更多