PHP yöntem çağrıları köri mümkün mü?

4 Cevap php

Ben bir WSDL dosyası için oluşturulan bir SoapClient örneği var. Metot çağrımı biri hariç tüm kullanıcı adı ve kimliği geçirilecek şifre gerektirir.

Ben kullanıcı adı ve parolayı atlarsanız böylece yöntem çağrıları currying herhangi bir yolu var mı?

4 Cevap

Php 5.3 gibi bir değişken bir anonymous function saklayabilirsiniz. Bu anonim işlev bazı önceden tanımlanmış parametreleri ile "orijinal" işlevini çağırabilirsiniz.

function foo($x, $y, $z) {
  echo "$x - $y - $z";
}

$bar = function($z) {
  foo('A', 'B', $z);
};

$bar('C');

edit: Ayrıca anonim işlevinin oluşturulmasını parametrelendirmek bir kapatma kullanabilirsiniz

function foo($x, $y, $z) {
  echo "$x - $y - $z";
}

function fnFoo($x, $y) {
  return function($z) use($x,$y) {
    foo($x, $y, $z);
  };
}

$bar = fnFoo('A', 'B');
$bar('C');

edit2: Bu da nesneler ile çalışır

class Foo {
  public function bar($x, $y, $z) {
    echo "$x - $y - $z";
  }
}

function fnFoobar($obj, $x, $z) {
  return function ($y) use ($obj,$x,$z) {
    $obj->bar($x, $y, $z);
  };
}

$foo = new Foo;
$bar = fnFoobar($foo, 'A', 'C');
$bar('B');

Tam bir sınıf "geliştirmek" için istiyorsanız Ama __ () çağrısı ve bir sarıcı sınıfını kullanarak diğer önerileri daha iyi olabilir.

PHP başına currying yok, ancak çeşitli yollarla böyle bir şey yapabilir. Belirli bir durumda, böyle bir şey işe yarayabilir:

class MySoapClient extends SoapClient {
  ...
  public function __call($meth,$args) {
    if (substr($method,0,5) == 'curry') {
      array_unshift($args,PASSWORD);
      array_unshift($args,USERNAME);
      return call_user_func_array(array($this,substr($meth,5)),$args);
    } else {
      return parent::__call($meth,$args);
    }
  }
}
$soapClient = new MySoapClient();
...
// now the following two are equivalent
$soapClient->currysomeMethod($additionalArg);
$soapClient->someMethod(USERNAME,PASSWORD,$additionalArg);

Burada PHP> = 5.3 currying için daha genel bir çözüm olsa da:

$curriedMethod = function ($additionalArg) use ($soapClient) { return $soapClient->method(USERNAME,PASSWORD,$additionalArg); }

$result = $curriedMethod('some argument');

Çok iyi değil bir çözüm olsa da, gerçek işlevini diyoruz ama argüman listesine kullanıcı adı ve parola eklemek için Phps magic methods (Özellikle __ çağrı) kullanılan temel bir sarıcı sınıf yazabilirsiniz.

Temel örnek:

class SC{
    private $usr;
    private $pass;

    public function __construct($usr, $pass){
        $this->usr = $usr;
        $this->pass = $pass;
    }

    public function __call($name, $arguments) {
        $arguments = array_merge(array($this->usr, $this->pass), $arguments);  
        call_user_func($name, $arguments);
    }
}

Ben bugün bu içine bazı ilgili araştırma yaptım. Bu benim alabilir olarak yakındır:

function curryAdd($x)
{
  return function($y = null) use ($x)
  {
    if (is_null($y)) return $x;
    else return curryAdd($x + $y);
  };
}

// echo curryAdd(1)(2)(3)(4);
echo curryAdd(1)
  ->__invoke(2)
  ->__invoke(3)
  ->__invoke(4)
  ->__invoke();

Önemli sorun PHP bir dönüş değeri doğrudan bir kapatma (çok aynı şekilde PHP ilişkisiz bir nesne üzerinde bir yöntem yürütme izin vermez) çalıştırmasına izin vermez değildir. Kapanışları yerleşik bir yöntem __ (çağırmak zorunda tipi Kapanış bir nesne,) olduğundan Ancak, yukarıda çalışacaktır.