PHP: sizi yarattı sınıf aramak mümkün mü?

5 Cevap

Başka bir sınıf oluşturur php bir sınıf var ve ben bu çocuğun sınıf üst sınıf aramak için güçlü olmak istiyorum, ama çocuk sınıfa bir argüman olarak $ this geçirmeden. Ben de üst sınıf küresel yapmak istemiyorum. Nasılsa ebeveyn-> fonksiyonu veya benzeri bir şey gibi üst sınıf, aramak için bir yolu var mı?

5 Cevap

Ben bir ebeveyn-çocuk ilişkisi sadece bir bileşim ('üst' hiyerarşi sınıfta alakasız bir örneğini, 'çocuk' tutan) dediğimiz düşünüyorum. Benim varsayım doğru ise, o zaman bu iki sınıf sıkıca bağlanmış ve bu olurdu, çünkü kötü kokuyor yerde kötü tasarım ('Ana', 'çocuk' ya da her ikisi) puan.

Az koklamak alternatifleri:

  • 'Çocuk' dan gerekli veri almak ve bu verilerle 'ebeveyn' yöntemini çağırın
  • 'Çocuk' için 'üst' tutan veri aktarmak ve 'çocuk' diyoruz böylece orada yöntemi koymak
  • 'Üst' in yöntemini çağırın ve 'çocuk' olarak geçmesi sonucunu
  • 'Ana' ve 'çocuk' hem de gerçekten ebeveyn ve çocuk olmak ve hem de yöntemi var bu yüzden mantıklı eğer miras kullanın, sonra 'Ana', bir 'çocuk' yaratmak için ihtiyacınız olmaz, bir çocuğa doğrudan kullanmak kodda.

Maciej dediği gibi, bu oldukça hackish, ve ben bunu tavsiye etmem, ama bu mümkün:

<?php

    class B 
    {
    	function B() {
    		$trace = debug_backtrace();
    		$trace[1]['object']->y();
    	}
    }

    class A 
    {
    	function x() {
    		$z = new B;
    	}
    	function y() {
    		printf("hi");
    	}
    }

    $test = new A;
    $test->x();

?>

Bu tür hack, ancak analiz deneyecek debug_backtrace()

(...) Ama alt sınıf bir argüman olarak bu $ geçirmeden

Gökler, NEDEN? "look ma, i can pee without holding'im with my hands. oops, now it happened again. great."

bu kadar basit olabilir, ama bu yasak neden biz biliyoruz asla varsayalım. benim tahminim sadece (sınıf ve örnek hiyerarşiler arasındaki karışıklık olarak göstermektedir) OOP anlamıyorum, ve bunu öğrenmek için çok tembel. Ceci n'est pas une pipe!

bak:

<?php
    class AClass {
        public $parent = false;

        public function setParent($parent) {
            $this->parent = $parent;
        }

        public function createChild() {
            $newInstance = new AClass();
            $newInstance->setParent($this);
        }
    }
?>

Evet, bu kadar kolay! Şimdi ebeveyn.

or is it, because you're not allowed to modify the parent class?
there's a secret, but i'll tell you:

Kötü warlock için 0 seviye efsun: inheritance , also known as "class B extends A {} ".

i ortalama, sarcasic, yararsızdır, eşek olma için şimdiden özür dilerim, ama gerçekten özür arkasında durdu olsaydın, ben bu cevabı yazılı olmazdı.

BUT i sorunuzu kadar oy veriyorum (ve dürüstçe özür) bir referans geçen yasak olduğunu neden bize iyi bir sebep verebilir eğer.

Ben bu mümkün olmadığını bilecek kadar PHP yapmayın ama nesnenin kurucu bir temsilci / geri arama geçmek olamazdı? Bu şekilde orada bütün nesneyi aramak istediğiniz yöntemi için sadece bir başvuru yok!

HTH

OneShot