我有以下课程
namespace PG\Referrer\Single\Post;
class Referrer implements ReferrerInterface
{
/**
* @var $authorReferrer = null
*/
protected $isAuthorReferrer = null;
/**
* @var $dateReferrer = null
*/
protected $isDateReferrer = null;
/**
* @var $searchReferrer = null
*/
protected $isSearchReferrer = null;
/**
* @var $taxReferrer = null
*/
protected $isTaxReferrer = null;
/**
* @param array $values = null;
*/
public function __construct(array $values = null)
{
if ($values)
$this->setBulk($values);
}
/**
* Bulk setter Let you set the variables via array or object
*/
public function setBulk($values)
{
if (!is_array($values) && !$values instanceof \stdClass) {
throw new \InvalidArgumentException(
sprintf(
'%s needs either an array, or an instance of \\stdClass to be passed, instead saw %s',
__METHOD__,
is_object($values) ? get_class($values) : gettype($values)
)
);
}
foreach ($values as $name => $value) {//create setter from $name
global $wp_query;
if (array_key_exists($value, $wp_query->query_vars)) { //Check that user don't set a reserved query vars
throw new \InvalidArgumentException(
sprintf(
'%s is a reserved query_vars and cannot be used. Please use a unique value',
$value
)
);
}
$setter = 'set' . $name;
$condition = isset($_GET[$value]);
if ($setter !== 'setBulk' && method_exists($this, $setter)) {
$this->{$setter}($condition);//set value (bool)
}
}
return $this;
}
/**
* @param bool $authorReferrer
* @return $this
*/
public function setAuthorReferrer($isAuthorReferrer)
{
$this->isAuthorReferrer = $isAuthorReferrer;
return $this;
}
/**
* @param bool $dateReferrer
* @return $this
*/
public function setDateReferrer($isDateReferrer)
{
$this->isDateReferrer = $isDateReferrer;
return $this;
}
/**
* @param bool $searchReferrer
* @return $this
*/
public function isSearchReferrer($isSearchReferrer)
{
$this->isSearchReferrer = $isSearchReferrer;
return $this;
}
/**
* @param bool $taxReferrer
* @return $this
*/
public function setTaxReferrer($isTaxReferrer)
{
$this->isTaxReferrer = $isTaxReferrer;
return $this;
}
}
及其界面
namespace PG\Referrer\Single\Post;
interface ReferrerInterface
{
/**
* @param array $values
* @return $this
*/
public function setBulk($values);
/**
* @param bool $authorReferrer
* @return $this
*/
public function setAuthorReferrer($isAuthorReferrer);
/**
* @param bool $dateReferrer
* @return $this
*/
public function setDateReferrer($isDateReferrer);
/**
* @param bool $searchReferrer
* @return $this
*/
public function isSearchReferrer($isSearchReferrer);
/**
* @param bool $taxReferrer
* @return $this
*/
public function setTaxReferrer($isTaxReferrer);
}
这个类设置了我需要在另一个类中使用的4个条件。此类中使用的值也是从另一个类设置的,所以基本上用户设置另一个类中的值(让我们称之为类b)然后由类Referrer使用并返回4个条件,然后由b级。
我这样做的原因是因为会有另外两个类需要做同样的事情,但会返回不同的信息
实现这一目标的更正确方法是什么?
要清除这一点
类推荐人
属性$isAuthorReferrer
,$isDateReferrer
等将具有值null
或布尔值,具体取决于用户设置的值。
示例:
$q = new Referrer(['authorReferrer' => 'aq']);
在上面的代码中,当变量$isAuthorReferrer
在URL中可用时,setBulk()
通过类中的aq
方法设置为true,如果不存在,则设置为false。其他三个属性将返回null,因为它们未在示例中设置。
以上内容按预期工作,但我需要在另一个类中执行此操作,再次调用它class b
。参数将设置为类b,反过来,类b将此参数设置为类Referrer,类Referrer将使用此参数并返回其属性的正确值,类b将使用此结果执行其他操作< / p>
示例:
$q = new b(['authorReferrer' => 'aq']);
哪个类b可能是这样的(这部分我不知道如何编码)
class b implements bInterface
{
protected $w;
protected $other;
public function __construct($args = [])
{
//Do something here
// Do something here so that we can use $other in other classes or functions
}
public function a()
{
$w = new Referrer($args);
}
public function b()
{
// use $w properties here
// return $other for usage in other classes and functions
}
}
答案 0 :(得分:2)
最好的方法是将引荐者注入您的课程,以便在他们和引荐来源之间loose coupling(此模式使用您的ReferrerInterface
的好处):
class b implements bInterface
{
protected $referrer;
public function __construct(ReferrerInterface $referrer, array $values = array())
{
$this->referrer = $referrer;
$this->referrer->setBulk($values);
}
public function getReferrer()
{
return $this->referrer;
}
public function b()
{
// use $this->referrer properties here
}
}
// Instantiation (use your dependency injection if you have one):
$referrer = new Referrer();
$b = new b($referrer, ['authorReferrer' => 'aq']);
我不明白什么是$other
所以我删除了它但是如果你想让我再添加它就解释一下。
如果您需要在b
中使用引荐来源者的属性,则应在ReferrerInterface
中添加一些getter以允许这样做。我会使用setAuthorReferrer($isAuthorReferrer)
来设置值,并使用isAuthorReferrer()
来获取它。