PHP, bir nesne örneğini ve aynı hat üzerinde bir yöntemini çağırabilir?

7 Cevap php

Ne yapmak istiyorsunuz bu gibi bir şeydir:

$method_result = new Obj()->method();

Bunun yerine yapmak zorunda:

$obj = new Obj();
$method_result = $obj->method();

Sonuç aslında benim özel durumda benim için önemli değil. Ancak, bunu yapmak için bir yolu var mı?

7 Cevap

Sizin için sorduk özelliği PHP 5.4 edinilebilir. Burada PHP 5.4 yeni özelliklerin listesi:

http://docs.php.net/manual/en/migration54.new-features.php

Ve yeni özellikler listesinden ilgili bölümü:

Örnekleme üzerinde sınıf üyesi erişim eklenmiştir örneğin (Yeni Foo) -> bar ().

Sen ne soruyorsun yapamaz; ancak PHP, bir sınıf olarak aynı ada sahip bir işleve sahip olabilir, gerçeğini kullanarak, "hile" olabilir; bu isimlerin çakışmaması olmaz.

Yani, böyle bir sınıf ilan eğer:

class Test {
    public function __construct($param) {
        $this->_var = $param;
    }
    public function myMethod() {
        return $this->_var * 2;
    }
    protected $_var;
}

Daha sonra bu sınıfın bir örneğini döndüren bir işlev bildirmek - ve sınıf tam olarak aynı ada sahip:

function Test($param) {
    return new Test($param);
}

Ve şimdi, bu sordu gibi, bir tek-liner kullanmak mümkün olur - tek şey, böylece yeni kullanarak değil, işlevi çağrılırken edilmiştir:

$a = Test(10)->myMethod();
var_dump($a);

Ve bu işleri: burada, ben alıyorum:

int 20

çıkışı olarak.


And, better, you can put some phpdoc on your function :

/**
 * @return Test
 */
function Test($param) {
    return new Test($param);
}

Bu şekilde, hatta IDE ipuçları olacak - en azından, Eclipse PDT 2.x ile; screeshot bakın:



Edit 2010-11-30 : Sadece bilgi için, yeni bir RFC PHP'nin gelecek sürümlerinden birine bu özelliği eklemek için önerdiği, bir kaç gün önce, teslim edilmiştir.

Bkz: Request for Comments: Instance and method call/property access

Yani, bu gibi belki şeyler yapıyor PHP 5.4 veya başka bir gelecek sürümünde mümkün olacaktır:

(new foo())->bar()
(new $foo())->bar
(new $bar->y)->x
(new foo)[0]

Sen bir kimlik işlevi tanımlayarak daha evrensel yapabilirsiniz:

function identity($x) {
    return $x;
}

identity(new Obj)->method();

Bu şekilde her bir sınıf için bir işlev tanımlamak gerekmez.

No, this is not possible.
You need to assign the instance to a variable before you can call any of it's methods.

Eğer gerçekten bunu yapmak için wan't ropstah anlaşılacağı gibi bir fabrika kullanabilirsiniz:

class objFactory{
  public static function newObj(){
      return new Obj();
  }
}
objFacotry::newObj()->method();

Nasıl hakkında:

$ Obj = new Obj (); $ Method_result = $ obj-> yöntemi (); ?

: P

Sen nesneyi üretmek için statik bir fabrika yöntemini kullanabilirsiniz:

ObjectFactory::NewObj()->method();

Ben de, bir biçimden diğerine tarihleri ​​dönüştürmek için tek bir ifadenin parçası olarak bunu gerçekleştirmek için bir tek-liner arıyordu. Tek bir mantıksal işlem çünkü ben tek bir kod satırında bu yapıyor gibi. Yani, bu biraz karışık, ama başlatmanızı ve tek bir hat içinde bir tarih nesnesi kullanmanızı sağlar:

$newDateString = ($d = new DateTime('2011-08-30') ? $d->format('F d, Y') : '');

Tek-hat için başka bir yolu başka bir biçimden diğerine Tarih dizeleri dönüşüm kodu OO parçaları yönetmek için bir yardımcı işlevi kullanmak için:

function convertDate($oldDateString,$newDateFormatString) {
    $d = new DateTime($oldDateString);
    return $d->format($newDateFormatString);
}

$myNewDate = convertDate($myOldDate,'F d, Y');

Ben nesne yönelimli yaklaşım serin ve gerekli olduğunu düşünüyorum, ama bazen basit işlemleri gerçekleştirmek için çok fazla adım gerektiren sıkıcı olabilir.