我有类似的代码片段
class Search
{
public function search($for, $regEx, $flag) //I would like this to be the constructor
{
// logic here
return $this;
}
}
然后我有另一个从中创建对象的类,然后尝试使用该对象。
class MyClass
{
public function start()
{
$this->search = new Search();
}
public function load()
{
$this->search($for, $regEx, $flag);
}
}
我的问题是,是否可以先创建一个对象然后给它参数?
我知道有一些解决方法,但我只是问,因为我想使用像这样的对象
$this->search($params);
// I have my methods chained, so I could use it in one line like
// $this->search($params)->hasResults();
if ($this->search->hasResults()) {
echo 'found stuff';
} else {
echo 'didn't find anything';
}
我现在设置它的方式,我需要像这样使用它
$this->search->search($params);
if ($this->search->hasResults()) {
echo 'found stuff';
} else {
echo 'didn't find anything';
}
我有一个名为search()
的方法来执行逻辑,我不希望在命名中多余,也不想更改方法的名称。
我知道另一种保持视觉吸引力的方法,我可以传递一个像这样的变量
$search = $this->search->search($params);
然后
$search->hasResults();
与此同时,我试图向自己介绍新的OOP概念并从中学习。这需要通过参考传递东西吗?或者设置某种魔法?
答案 0 :(得分:0)
class Example {
public $any;
function __counstruct($parameters,$some_text) {
$this->any=$some_text;
return $this->any;
}
}
你可以调用构造函数:
$obj = new Example (true,'hello');
echo $obj->any;
$obj->__construct(true,'bye-bye');
echo $obj->any;
答案 1 :(得分:0)
是的,有可能
见下面的例子
<?php
class a{
public $a = 5;
public function __construct($var){
$this->a = $var;
}
}
$delta = new a(10);
echo $delta->a."\n";
$delta->__construct(15);
echo $delta->a."\n";
输出将是:
10 15
答案 2 :(得分:0)
我能够使用像这样的__call()
魔术方法创建我想要的可视化编码
public function __call($name, $params)
{
$call = ucfirst($name);
$this->$name = new $call($params);
}
从那里我可以使用这个
$this->test->search($params);
$this->test->search->hasResults();
我当然现在将search()
方法设置为类构造函数
答案 3 :(得分:0)
虽然以前的导师表明你可以,但我不会使用它,因为它打破了封装的概念。实现目标的正确方法如下:
class Search
{
public function __constructor($for='', $regEx='', $flag='')
{
$this->Setup($for, $regEx, $flag);
}
public function Setup($for, $regEx, $flag)
{
//assign params
//clear last result search
//chain
return $this;
}
public function search()
{
// logic here
return $this;
}
}
通过这种方式,您可以重用该对象并在构造函数中使用params,而不会破坏封装。