在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! */ }
}
}