Yine de var mı cepten yönteminin sırası çağrıldığını almak için?

4 Cevap php

Örneğin ben bunu sınıflar ve yöntemler bir dizi var diyelim:

$obj->method1()->method2();

Onun son bilmek onun ilk yöntem denir ya Method2 için varlık kendi içinde birlikte bilmek Method1 () için yine de var mı?

Some more details
I just want to be able to build a set of these calls so that it either returns an instance of itself if the call to the method isnt at the end of the chain or return something different if its at the end.

Örneğin

$obj->method1()->method2(); #Here method 2 will return lets say a string.
$obj->method1()->method2()->method3(); #Since method2 isnt at the end of the chain, it should return an instance of itself (or another object) here so that the chain could continue.

EDIT: anyone whoz trying to do this - it is a bad design pattern.

Bu yinelenen olarak görünüyor. Daha cevaplar için this question bakın.

4 Cevap

Yapabileceğin tüm yöntemler sınıfında küresel devlet çeşit ayarlayarak, so far denilen edildiği bulmak. Ama yöntemleri bir yönteme sonra çağrıldığını ne olduğunu bulamıyor ve başka bir zincirde yöntemleri ve yöntemler arasındaki farkı söylemek mümkün olmaz:

$obj->m1()->m2();
$obj->m3(); // You would think that m1() and m2() came before this in the same chain

Bu sınıfta, küresel durumunu temizlemek için her bir zincirin sonunda bir yöntemi olması gerekir.

Eğer next zinciri gelir hangi yöntemin görmek gerekir gibi görünüyor bu yana, bu sizin için çalışmaz.

Ben bu en azından PHP için gerçekten kötü bir tasarım deseni, (ve ben de çalıştım her dili) olduğunu söyleyebilirim. Her yöntemin tek bir şey yapmalıyız. Eğer daha sonrası için ihtiyacınız ne bağlı bir dize ya da bir nesneyi döndürmek için ya bir yöntemi gerekiyorsa, sen yanlış bir şey yapıyorsun.

Verilen, ben daha önce böyle bir şey yapmış. Bu kullanıcılar tarafından gönderilen görüntüler için bir meta-bilgi sınıf - Böyle kurmak olabilir:

$meta = new ImageMeta();
$meta->first_name("foo")->last_name("bar")->email("baz")->id("guid");

Ancak, bu olsaydı:

$meta->first_name();

bir dize dönecekti. Ilk parametre için varsayılan değer NULL ve yöntem NULL var ise, bu bir dize döndürülür. Aksi takdirde bu seti (ve kaçtı) bir iç değer ve iade $this.

İlk başta ben o tür cool olduğunu düşündüm, ama bunun bir hata olduğu ortaya çıktı. Ben şimdi sınıfını kullanarak nefret ediyorum. Sadece bir metot / fonksiyon one şey, sadece ne yapmak ve size çok daha mutlu olacaktır.

Değil kutunun dışında değil, hatta bir yığın iz.

Ben sabitleri veya küresel değişkenler birlikte bir şeyler koymak sanırım:

Don't try this at home!

$GLOBALS["chain"] = array();
$obj->method1()->method2();    // method1 adds member to $GLOBALS["chain"], 
                               // array_push($GLOBALS["chain"], __FUNCTION__);
                               // method2 does the same...
print_r($GLOBALS["chain"]);

İşte size tam zinciri verecek - henüz sonuncusu olan biri, bunu yapmak için, size method2() için bir bayrak geçmek zorunda olacaktır.

Ama bu korkunç hacky olabilir ve kodunuzu kirletmez olacaktır.

Eğer bu ihtiyaç belirli bir nedeni var mı?

En azından ben bu konuda bir şey görmedim - Ben hayır, bu mümkün olduğunu sanmıyorum.

(Out of curiosity : why would you need that ? Maybe it would be possible to use onther solution to solve your actual problem ?)

Bu mümkün tek yolu, yöntemler, bazı küresel durumunu kaydetmek izin vermektir.

Her iki yöntem de aynı sınıfta iseniz, sınıfa bir değişken eklemek ve her sınıf benzersiz bir değer ayarlamak izin verebilir.

Bu arzu Ama eğer soru. Bu tarz bir davranış, uzun vadede genellikle çok akıllı değildir.