Bu PHP mümkün mü?

4 Cevap php

Aşağıdaki PHP parçasını inceleyin:

<?php

class Is
{
    function __get($key)
    {
    	$class = __CLASS__ . '_' . $key;

    	if (class_exists($class) === true)
    	{
    		return $this->$key = new $class();
    	}

    	return false;
    }

    function Domain($string)
    {
    	if (preg_match('~^[0-9a-z\-]{1,63}\.[a-z]{2,6}$~i', $string) > 0)
    	{
    		return true;
    	}

    	return false;
    }
}

class Is_Domain
{
    function Available($domain)
    {
    	if (gethostbynamel($domain) !== false)
    	{
    		return true;
    	}

    	return false;
    }
}

$Is = new Is();

var_dump($Is->Domain('google.com')); // true
var_dump($Is->Domain->Available('google.com')); // false

?>

Böyle Mevcut () yöntemini çağırın (ve hala mevcut yöntem denir değilse, sadece doğru veya yanlış dönüş) mümkün mü?

var_dump($Is->Domain('google.com')->Available()); // false

Evetse, nasıl?

EDIT: Would this do the trick?

class Is
{
    function __get($key)
    {
    	// same as before
    }

    function Domain($string)
    {
    	if (preg_match('~^[0-9a-z\-]{1,63}\.[a-z]{2,6}$~i', $string) > 0)
    	{
    		return (bool) $this->Domain;
    	}

    	return false;
    }
}

class Is_Domain
{
    function __toString()
    {
    	return true;
    }

    function Available($domain)
    {
    	if (gethostbynamel($domain) !== false)
    	{
    		return true;
    	}

    	return false;
    }
}

Şimdiden teşekkürler!

PS: Bu pasajı kesiliyor, bu yüzden sadece kendi ile bu anlamda bir sürü yapmak için beklemeyin.

4 Cevap

Esasen Eğer sonuç bir sonraki yöntem çağrısı meydana gidiyor olup dayalı bir bool ya da bir nesneyi ya dönmek için bir yöntem istiyorum. Bu bazı büyük kesmek (örneğin kendinizi PHP dosya okuma ve ileriye bakarak) olmadan mümkün olacağını sanmıyorum, ve nesneler, kullanıldığı bağlamda endişesi olmamalı çünkü olmamalıdır.

Bunun yerine ilk çağrı, örneğin, her iki durumda da uygun bir nesneyi döndürmek için alabilir Örneğin iki yöntem vardır DomainLookupResult, IsAvailable () Var () ve. Daha sonra yapabilirdi:

$result = $Is->Domain('google.com');
$isValid = $result->Exists();
$isAvaliable = $result->IsAvailable();

//or chaining:

$isValid = $Is->Domain('google.com')->Exists();
$isAvailable = $Is->Domain('google.com')->IsAvailable();

You can only chain method calls if they return an object! This is because you can only call methods on objects.

Kodunuzu sorun yöntemler doğru ya da yanlış, olmayan bir nesne değeri döndürür olmasıdır. Ve sorun yöntemlerini zincirleme daha iyi çözülmüş herhangi bir şekilde değil. Sen nerede onun uygulanabilir olduğunu kullanmalısınız. Birçok belirleyiciler DEĞİL, aslında kullanmak istediğiniz yöntemleri alıcılar zincirleme gibi.

var_dump($Is->Domain->Available('google.com')); // false
//is the same as
$res = $Is->Domain;
$res = $res->Available('google.com'));
var_dump($res);

Yani ilk res doğru veya yanlış bir boolean görmek, ve bu konuda bir yöntemi çağırmak olamaz.

edit This might be a "solution". Not a good solution though since this is better without chaining.

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);

/edit

Bu, yukarıda sorununuzu çözecektir.

var_dump($Is->Domain('validandfreedomain.com') && $Is_Domain->Available('validandfreedomain.com')); // true

Umutsuzca bu sorun için zincirine bir yöntem istiyorsanız bunu daha böyle yapabilir.

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();

Yöntem zincirleme bakınız.

More information

Bu fonksiyonu bir nesne döndürür eğer, (bkz. method chaining) yani onun yöntemini çağırabilirsiniz, mümkündür. Kadarıyla biliyorum gibi - - tek sınırlama olduğunu yeni tarafından oluşturulan bir nesneden zincir çağrıları (-> Metodu1 () -> method2 () new Object ()) yapamam ki.

Lütfen Örneğin gelince, ben dinamik bir sınıf veya yöntem zincirleme malzeme kullanılarak hiçbir noktaya bakın.