将类实例化为对象后,我可以传递__construct参数吗?

时间:2012-03-22 07:23:12

标签: php oop

我有类似的代码片段

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概念并从中学习。这需要通过参考传递东西吗?或者设置某种魔法?

4 个答案:

答案 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,而不会破坏封装。