php sınıfları uzanan

5 Cevap php

Ben SforceEnterpriseClient adında bir salesforce sınıfını kullanıyorum. Benim uygulamada bu sınıf birçok yerde başvurulan. Ben bunu hemen kayıt kümesi yaklaşık 3 düzeyleri derin, 1 satır kayıt tek bir dizi dönmek için becerisi kazandırmak için o sınıfı genişletmek istiyorum. Ben de onunla yapmak istediğiniz bir kaç şey var. Ben tüm bu işleyebilir.

Ben sınıfları hakkında okudum her şeyi ben bir sınıf uzatmak zaman, ben gibi yeni birini aramak gerektiğini söylüyor:

class MySF extends SforceEnterpriseClient {};
$mySforceConnection = new $MySF;

That means in all of my existing code I have to find/replace. Is it possible to overwrite the parent with the child so I don't have to play the find/replace game?

class SforceEnterpriseClient  extends SforceEnterpriseClient {};
$mySforceConnection = new $SforceEnterpriseClient ;

5 Cevap

Buna ne dersin, sınıfın için kaynak dosyası, sınıf yeniden adlandırın (ve büyük olasılıkla yapıcı yanı sıra) sonra gibi bir şey kullanarak sınıfını genişletmek

class SforceEnterpriseClient extends renamedClass {};

Ardından dosyayı yeniden adlandırın ve eski adı ile yeni bir dosya oluşturun ve adını dosyası içerir. Yeni dosyaya genişletilmiş versiyonu için kod koymak. Nihai sonuç orijinal kullanan her dosya hepsini izini kalmadan yeni versiyonunu göreceksiniz olmasıdır.

Hakkında tek büyük sorun sınıfının yeni bir sürümü kullanılabilir olduğunda ne olacaktır.

Muhtemelen büyü __autoload() fonksiyonu ve salesforce dosya yani başvurular kaldırılması ile bazı Classloading hileler oynayabilirsiniz. , require_oncenin gerektiren, include_onceyi şunlardır; Fakat okunabilirliği ve bakımı ilgi, muhtemelen alt sınıfı kullanmak için tüm başvuruları burada uzun yol almak ve değiştirmek gerekir.

Ne yazık ki, bunu yapmak için tek yol olacaktır. Sen inhertiance ters olamaz. Üzgünüm ve iyi şanslar!

Kyle

Belki bu senaryoda sınıfını genişletmek gerekmez. Yeni işlevsellik eklemek veya varolan işlevselliğini değiştirmek VE bozulmadan orijinal sınıfını tutmak istediğinizde sınıfını genişletmek. Genellikle bu gitmek için yoludur. Ancak, varolan bir sınıf için bir değişiklik yapmak ve sonra sadece sınıf kodunu kendisi değişmez, neden yeni sınıfa başvurmak için sınıfa bütün referansların güncellenmesi gerekiyorsa? Bu şekilde başvuruları değiştirmek zorunda değildir.

Also have a look at the factory pattern. Normally you should keep class creation and business logic separate.
So when you come across a problem like this, you only have to go and change the factory...

$sfEnterpriseClient = Factory::getSFEnterpriseClient($params);

önleyebilirsiniz bu şekilde 'yeni' iş mantığı içinde inşa, ve kod daha kolay yönetilebilir kılar