Вы можете связывать вызовы методов, только если они возвращают объект!
Это потому, что вы можете вызывать методы только для объектов.
Проблема с вашим кодом состоит в том, что методы возвращают не объектное значение, истинное или ложное. И проблема никак не решается лучше с помощью цепочки методов. Вы должны использовать это там, где это применимо. Подобно цепочке множества сеттеров, а не геттеров, которые по сути представляют собой методы, которые вы хотите использовать.
var_dump($Is->Domain->Available('google.com')); // false
//is the same as
$res = $Is->Domain;
$res = $res->Available('google.com'));
var_dump($res);
Итак, вы видите, что первое res - это логическое true или false, и вы не можете вызвать метод для этого.
редактировать
Это может быть «решением». Хотя это не очень хорошее решение, так как лучше без цепочки.
class Domain
{
public $domain;
function setDomain($domain) {
$this->domain = $domain;
return $this;
}
function isDomain($domain = null) {
if (is_string($domain)) {
$this->setDomain($domain);
}
$result = gethostbynamel($this->domain) !== false;
return new Result($this, $result);
}
function isValid() {
$result = (bool) preg_match('', $this->domain);
return new Result($this, $result)
}
}
class Result
{
public $result;
public $object;
public function __construct($object, $result)
{
$this->result = $result;
$this->object = $object;
}
public function __call($method, $arguments)
{
if (is_object($this->result)) {
return call_user_func_array(array($this->result, $method), $arguments);
}
if (!$this->result) {
return $this;
}
return call_user_func_array(array($this->object, $method), $arguments);
}
}
$domain = new Domain();
var_dump($domain->isValid('google.com')->isAvailable()->result);
/ редактировать
Это решит вашу проблему выше.
var_dump($Is->Domain('validandfreedomain.com') && $Is_Domain->Available('validandfreedomain.com')); // true
Если вы отчаянно хотите связать метод для этой проблемы, вы можете сделать его более похожим на это.
class Domain
{
public $domain;
function setDomain($domain) {
$this->domain = $domain;
return $this;
}
function isAvailable() {
return gethostbynamel($this->domain) !== false;
}
function isValid() {
return (bool) preg_match('', $this->domain);
}
}
$domain = new Domain();
$result = $domain->setDomain('validandfreedomain.com')->isValid() && $domain->isAvailable();