对不起,还是OO的新手。
我正在使用CodeIgniter,但这个问题基本上只是PHP OO。
我有一个包含许多函数的类文件,它们执行类似的操作:
function blah_method($the_id=null)
{
// if no the_id set, set it to user's default
if(!isset($the_id)){
$the_id = $this->member['the_id'];
}
现在,我可以在构造函数中设置它,而不是在此类的每个方法上执行此操作吗?所以我仍然可以明确传递$ the_id,以覆盖它,但除此之外它总是默认为$this->member['the_id'];
这样做最优雅的方式是什么?
答案 0 :(得分:0)
如何将所有初始化数据作为数组传递给构造函数?
public function __construct(array $settings) {
// if 'the_id' has not been passed default to class property.
$the_id = isset($settings['the_id']) ? $settings['the_id'] : $this->member['the_id'];
// etc
}
答案 1 :(得分:0)
我认为最优雅的方法是扩展arrayobject类并覆盖在尝试访问未设置的属性时调用的offset方法。然后你可以返回或设置你需要的东西而忘记构造。
答案 2 :(得分:-1)
你可以这样做:
class A {
private $id = null;
public function __construct($this_id=null){
$this->id = $this_id;
}
public function _method1(){
echo 'Method 1 says: ' . $this->id . '<br/>';
return "M1";
}
public function _method2($param){
echo 'Method 2 got param '.$param.', and says: ' . $this->id . '<br/>';
return "M2";
}
public function __call($name, $args){
if (count($args) > 0) {
$this->id = $args[0];
array_shift($args);
}
return (count($args) > 0)
? call_user_func_array(array($this, '_'.$name), $args)
: call_user_func(array($this, '_'.$name));
}
}
$a = new A(1);
echo $a->method1() . '<br>';
echo $a->method2(2,5) . '<br>';
当然它很难看,如果你在函数中有更多的可选变量会让你感到麻烦......
不过,输出是:Method 1 says: 1
M1
Method 2 got param 5, and says: 2
M2