PHP uzatır ve parent :: yöntemi ile yöntemini çağıran başka bir sınıftan denir bir sınıf yöntemi uzatmak

4 Cevap php

Ben bir sınıf genişletmek ve yöntemlerden birini geçersiz kılmak için çalışıyorum. o sınıf A. Benim sınıf, sınıf B aramak sağlayan, korumalı bir yöntem overiding edilir. C Sınıfı A sınıfı genişletir ve D Sınıfı Sınıf D sınıfı C. İç uzanır, ben üzerine yazmak çalışıyorum yöntemi de burada uzar ve ebeveyn :: mymethodimoverriding çağırır. Ben B sınıfı overiding yaşıyorum ve tabii ki B ile A uzatmak ve düşmemesi beri bu değişiklikler D sırıtmak olamaz yöntemdir sınıf A'da ona gider böylece bu yöntem C sınıfı yok sınıf hiyerarşisi doğrultusunda. Ben yanlış olabilir, bu yüzden lütfen beni düzeltin olabilir.

benim sınıf b denir ve D sınıfı olarak adlandırılan alır sonra koştum yani eğer A yöntemini çalıştırır ve ben batmıştı ne yazar. Ben iş için bu almak için bir yolu olmalı düşünüyorum, ben sadece bir şey eksik.

Orada SetTitle için bir çağrı ve ben "NewExample" olarak ayarlayın Benim sınıfımda için "örnek" olarak ayarlandığında A sınıfı gördüğünüz gibi İşte bir örnek vardır. Benim sınıf çok D sınıfı çağrıldığında geri ebeveyne gider ve "Örnek" için başlığını ayarlar D sınıfı önce çağrılır oluyor. Ne olmasını istiyorum B sınıfı çalışır ve ben daha sonra D sınıfı çalıştırmak ve bunun yerine yerine benim sınıf vurmak için ben uzanan am sınıf isabet bunu gerekenleri yapmak için ayarlar. şey ben D sınıfı benim sınıf uzatmak yapabilirsiniz sanmıyorum. yani şimdi ben uzanan am sınıfı vuruyor

class A{
  protected function _thefunction(){
    setTitle("Example");
  }
}

class B extends A{
  protected function _thefunction(){
    My new code here
    setTitle("NewExample");
  }
}

class C extends A{
  nothing that matters in here for what I am doing
}

class D extends C{
  protected function _thefunction(){
    parent::_thefunction();
    additional code here
  }
}

Ben yapıyorum denedim

class D extends C{
  protected function _thefunction(){
    B::_thefunction();
    additional code here
  }
}

ve ben bu statik bir yöntem olmadığı konusunda hatalar var

4 Cevap

Ben _thefunction anlayabiliyorum ne () başka bir nesneye ($ headBlock?) Bir şey yok. Sizin sınıf (B), bu nesnenin bir şey değiştirir sonra D sınıfı gider ve başka bir şeye dönüşür. Bunu düzeltmek için tek yol bir şekilde D'nin intereference devre dışı bırakmak ya da ondan sonra sınıf B yöntemi çalıştırmak sahip olmaktır.

Ben bu programın yapısına sahip olabilir ne yan etkiler bilmiyorum ancak, bunun yerine A C miras B sahip devralmayı kullanabilirsiniz.

Düzenleme: Bu belki size SO veya Magento forumlar ya Magento hakkında özel sormalısınız, bahsediyoruz Magento gibi görmek. Bunu kılamaz çok az şey var; belki size yaklaşım yerde yanlış bir dönüş aldım?

Ben B sınıfı overiding yaşıyorum ve tabii ki B ile A genişletmek ve sınıf hiyerarşi doğrultusunda düşmez beri bu değişiklikler D sırıtmak olamaz yöntemdir. Ben yanlış olabilir, bu yüzden lütfen beni düzeltin olabilir.

Ben burada korkuyorum. Eğer bütün kavramı yeniden işleme yoksa yapabileceğiniz pek bir şey yok.

Ben :: thefunction sınıfım diyoruz ama tabii bunu statik bir yöntem değil varlık hakkında bir şey söyleyen bir hata var alarak girişimi devre dışı bırakmak için çalıştı.

Eğer D sınıfı değiştirmek yapabiliyor musunuz? Ben bu kısmı anlamıyorum. Eğer öyleyse, ilk etapta bu soruyu soran olmaz, sanırım.

Belki Magento hakkında bazı özellikleri yardımcı olabilir? İstediğiniz sonuca ulaşmak için diğer bazı yolu muhtemelen vardır.

Sen B :: _theFunciton (aramaya çalışıyoruz) ama B yöntemi bu yöntemi tüm erişim kendi sınıfına veya herhangi bir alt sınıfları, D değildir, D sınıfı hiyerarşi için ayrılmıştır yani (korunmaktadır ... A-> C-> D, orada hiçbir B).

Işlevi de statik değildir, bu nedenle (B :: filan gibi referans olamaz)

Eğer gerçekten bunu istiyorsan o zaman gerçekten o zaman bir nesne ile ilgili bir yöntem sadece iyi pratik yolu ondan bir alt sınıf olmak olduğunu düşünüyorsanız, ancak statik kamu olarak _theFunction tanımlayabilirsiniz.

Ne muhtemelen yapmaya çalışıyorsun, en az iki nedenden dolayı yapılamaz:

  1. Sadece B ve onun soyundan gelenler için erişilebilir nedenle yöntemi _thefunction (B) de korunmaktadır.
  2. D B veya B soyundan ne değildir çünkü D sınıfı nesnesi için nesne B yöntemi arayamam