PHP bir sınıfın dışından korunan bir yöntemini çağırın

5 Cevap php

Ben bir sınıfın dışından korunan bir yöntemini çağırmanız gerekir ki çok özel bir durum var. Ben programmingwise ne hakkında çok bilinçli değilim, ama ben bu bir özel durumda bunu yaparken tamamen zıt olmaz. Diğer tüm durumlarda, ben iç yöntemine erişime izin vermeme devam etmek gerekir, ve bu yüzden ben yöntemi korunmasını istiyorum.

Bir sınıfın dışında bir korumalı yöntemi erişmek için bazı zarif yolları nelerdir? Şimdiye kadar, ben buldum this.

Ben sinsice iç yapısına erişimi sağlayacak hedef sınıfının çift ajan örneğinin çeşit oluşturmak mümkün olabilir herhalde ...

5 Cevap

Bu durumda, yeniden düzenleme bu yüzden bu tür bir şey muhtemelen gitmek için en zarif yoludur gerekmez düşünürdüm. Bir seçenek __call kullanmak ve bu ayrıştırma içinde debug_backtrace yöntemi denir hangi sınıf görmek olduğunu söyleyerek. Sonra arkadaş whitelst kontrol

class ProtectedClass {

    // Friend list
    private $friends = array('secret' => array('FriendClass')); 

    protected function secret($arg1, $arg2) {
        // ...
    }

    public function __call($method, $args) {

        $trace = debug_backtrace();
        $class = $trace[1]['class'];
        if(in_array($class, $this->friends[$method]))
            return $this->$method($args[0], $args[1]);

        throw new Exception();
    }
}

Ben bir duş ihtiyacım var.

Bu biraz kıytırık, ancak bir seçenek olabilir.

Korunan işleve erişim uğruna bir çocuğun sınıf ekleyin

public class Child extends Parent {
    public function protectedFunc() {
        return parent::protectedFunc();
    }
}

Ardından, Child yerine bir örneğini Parent bu işlevi çağırmak için gereken yere. Ayrıca bir örneğini yeniden döküm muktedir Parent olabilir:

$childObj = (Child)$parentObj;

Ama bu konuda bana teklif etmeyin.

Ben iki yıl içinde PHP programlanmış değil çünkü ben sadece orada bu dışarı atıyorum. Sadece korumalı yöntemi gibi pek çağırır sınıfına bir işlev eklemek misiniz?

$obj->publicFunc = create_function('$arg', 'return $this->protectedFunc($arg);');

Edit: I think Tom's correct in looking at the documentation for create_function. It looks like the scope of $this will be "wrong" when you try to call it with this example.


Geleneksel anonim fonksiyonlar yanı sıra PHP 5.3.0 'dan beri desteklenmektedir (ve benim ilk çözüm muhtemelen çalışmayacaktır) gibi görünüyor, bu yüzden muhtemelen onun yerine bu gibi yazmak isterim:

$obj->publicFunc = function($arg) { 
     return $this->protectedFunc($arg); 
};

Ben biraz temiz görünüyor (ve seçtiğiniz IDE elbette daha iyi vurgulayacaktır) düşünüyorum çünkü.


Ugh, ben yöntemini çağırmak için Reflection kullanarak çalıştı ancak PHP de bunu yapmana izin vermeyeceğim. Bu diğer posterler ettiler gibi alt sınıf çeşit kullanmak zorunda olacak gibi görünüyor. Eğer çalışan bir yöntem bulursanız, geliştiriciler muhtemelen gelecekte bir hata olarak sınıflandırmak ve size bir sonraki sürüme yükseltme yaparken kodunuzu bölünürler.

Ben sınıf uzanan öneririz.

Ben özel bir işlevi çağırmak için varsa program tasarımı ile olsun ne olduğu hakkında düşünmek istiyorum?

Bu durum için kullanıldığında

  • sınıf çeşitli şeyler için sorumlu olan (gerçekten birlikte sarılmış iki veya tasarımda calsses) veya
  • kapsülleme kuralları ihlal edilir (fayda fonksiyonları, örneğin)

Bu sorular etrafında yürümek için any yol bularak, hiçbir yerde yakın gerçek çözüm olacak.

Senin yöntem beyanı şöyle gidiyor varsayalım:

protected function getTheFoo() {
    ...
}

protected function setTheFoo($val) {
    ...
}

Kullanımı:

$obj->__get('the_foo');
$obj->__set('the_foo', 'myBar');

Bu korumalı yöntemleri atlar ve örnek değişkenleri doğrudan düz gider.