Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中初始化类成员的最佳实践_Php_Oop_Class_Constructor_Initialization - Fatal编程技术网

在php中初始化类成员的最佳实践

在php中初始化类成员的最佳实践,php,oop,class,constructor,initialization,Php,Oop,Class,Constructor,Initialization,在我的构造函数中有很多这样的代码:- function __construct($params) { $this->property = isset($params['property']) ? $params['property'] : default_val; } 一些默认值取自其他属性,这就是我在构造函数中执行此操作的原因。但我想这可以用二传来代替 这种方法的优缺点是什么?有更好的方法吗 编辑:我有一些依赖项,如果$params数组中没有提供属性,则该值取自另一个属性,

在我的构造函数中有很多这样的代码:-

function __construct($params) {

    $this->property = isset($params['property']) ? $params['property'] : default_val;

}
一些默认值取自其他属性,这就是我在构造函数中执行此操作的原因。但我想这可以用二传来代替

这种方法的优缺点是什么?有更好的方法吗

编辑:我有一些依赖项,如果
$params
数组中没有提供属性,则该值取自另一个属性,但是该其他属性可能是可选的,并且具有默认值,因此属性初始化的顺序很重要

这意味着如果我使用了getter和setter,那么调用它们的顺序就不明显了,因为依赖项被抽象到getter中,而不是构造函数中…

创建“全局可用”函数
数组\u get

public static function array_get($array, $property, $default_value = null) {
    return isset($array[$property]) ? $array[$property] : $default_value;
}
创建“全局可用”函数
array\u get

public static function array_get($array, $property, $default_value = null) {
    return isset($array[$property]) ? $array[$property] : $default_value;
}

我建议您编写适当的getter/setter函数,用于断言正确的数据类型和验证(并包含您提到的默认值逻辑)。这些应该在构造函数中使用。 当设置多个相互依赖的字段时,为这个复杂的数据设置一个单独的setter似乎很好。他们到底以何种方式依赖

e、 g:

更新您的编辑:
修改后的源代码应该可以解决您的所有需求(setter函数的顺序、get值的不同解析)。

我建议您编写适当的getter/setter函数,这些函数断言正确的数据类型和验证(并包含您提到的默认值逻辑)。这些应该在构造函数中使用。 当设置多个相互依赖的字段时,为这个复杂的数据设置一个单独的setter似乎很好。他们到底以何种方式依赖

e、 g:

更新您的编辑:
修改后的源代码应该可以解决您的所有需求(setter函数的顺序、get值的不同解析)。

当有很多默认选项时,您需要能够覆盖它们-正如您以前在jQuery中使用
.extend()
看到的那样-我喜欢使用这种简单而快速的方法:

特别是对于启动类来说,这是一种非常简单和灵活的方法,但是正如前面提到的,如果代码将被大量使用,那么使用getter和setter对这些选项引入更多的控制可能不是一个坏主意,特别是如果您需要在某些选项被获取或设置时采取措施,就像你的情况一样,如果我正确理解你的问题

还要注意,您不必自己实现getter和setter,在PHP中,您可以使用uuu get和uuu set魔术方法

下面是一些无用的代码,希望能提供一些想法:


请注意,在上面的示例中,我使用了不同的方法,这样混合它们通常是没有意义的。我这样做只是为了说明一些想法,希望您能够更好地决定什么更适合您的需要。

当有很多默认选项时,您需要能够覆盖它们-就像您以前在jQuery中使用
.extend()
看到的那样-我喜欢使用这种简单而快速的方法:

特别是对于启动类来说,这是一种非常简单和灵活的方法,但是正如前面提到的,如果代码将被大量使用,那么使用getter和setter对这些选项引入更多的控制可能不是一个坏主意,特别是如果您需要在某些选项被获取或设置时采取措施,就像你的情况一样,如果我正确理解你的问题

还要注意,您不必自己实现getter和setter,在PHP中,您可以使用uuu get和uuu set魔术方法

下面是一些无用的代码,希望能提供一些想法:


请注意,在上面的示例中,我使用了不同的方法,这样混合它们通常是没有意义的。我这样做只是为了说明一些想法,希望您能够更好地决定什么更适合您的需要。

这种方法会对我的一些依赖项产生问题,请参见我的上面的编辑修改后的源代码应该可以解决您的所有需求(setter函数的顺序、get值的不同解析).非常感谢你的回答。我想现在我要亲吻并坚持我目前的方法。相比之下,getter和setter似乎是一个巨大的代码量,我不确定这些好处是否值得投资,直到我们开始遇到当前方法的问题。不客气。但是请注意,这些通用的getter和setter最适合在超类中实现,您的所有模型都应该扩展它。乍一看似乎有很多代码,但您不必在模型类中反复实现这些代码。您只需在将来添加代码/方法,这与您的默认行为不同。此方法可能会与我的一些依赖项产生问题,请参阅上面的编辑。修改后的源代码应能解决您的所有需求(setter函数的顺序、get value的不同解析)。非常感谢您的回答。我想现在我要亲吻并坚持我目前的方法。相比之下,getter和setter似乎是一个巨大的代码量,我不确定这些好处是否值得投资,直到我们开始遇到当前方法的问题。不客气。但是请注意,这些通用的getter和setter最适合在超类中实现,您的所有模型都应该扩展它。乍一看似乎有很多代码,但您不必在模型类中反复实现这些代码。您只需在将来添加与默认行为不同的代码/方法
class Foo {
    private $options;

    public function __construct($override = array()) {
        $defaults = array(
           'param1' => 'foo', 
           'param2' => ..., 
           'paramN' => 'someOtherDefaultValue');
        $this->options= array_replace_recursive($defaults, $override);
    }
}     
[...inside Foo...]
public function __set($key, $value){
    switch(true){
        //option exists in this class
        case isset($this->options[$key]):
           //below check if $value is callable
           //and use those functions as "setter" handlers
           //they could resolve dependencies for example 
           $this->options[$key] = is_callable($value) ? $value($key) : $value;  
        break;
        //Adds a virtual setter to Foo. This so called 'magic' __set method is also called if the property doesn't exist in the class, so you can add arbitrary things.
        case $key === 'someVirtualSetterProp': Xyzzy::Noop($value); break;
        default: 
           try{ parent::__set($key, $value); } catch(Exception $e){ /* Oops, fix it! */ }
    }
}