Arkadaş ya da iç PHP eşdeğer

2 Cevap php

"Arkadaş" veya php "iç" bazı eşdeğer var mı? Eğer değilse, bu davranış elde etmek için takip için herhangi bir model var mı?

Edit: Sorry, but standard Php isn't what I'm looking for. I'm looking for something along the lines of what ringmaster did.

Ben C-tarzı sistemi arka uç aramaları ve hokkabazlık hantal olmaya başladı yapıyoruz sınıfları var. Ben bir parametre olarak nesne Yatak almak ve bir argüman olarak kendisi nesne B geçerken bir yöntemi çağırmak zorunda nesne A işlevlere sahiptir. Son kullanıcı B yöntemi diyebiliriz ve sistem darmadağın olur.

2 Cevap

PHP herhangi bir arkadaş gibi bildirimleri desteklemiyor. Bunu yapmak için kod tür beceriksiz olmasına rağmen, PHP5 __ almak ve __ set yöntemleri kullanarak ve yalnızca izin verilen arkadaşı sınıfları için bir backtrace teftiş bu taklit etmek mümkündür.

PHP'nin sitesinde konuyla ilgili bazı sample code ve tartışma var:

class HasFriends
{
    private $__friends = array('MyFriend', 'OtherFriend');

    public function __get($key)
    {
        $trace = debug_backtrace();
        if(isset($trace[1]['class']) && in_array($trace[1]['class'], $this->__friends)) {
            return $this->$key;
        }

        // normal __get() code here

        trigger_error('Cannot access private property ' . __CLASS__ . '::$' . $key, E_USER_ERROR);
    }

    public function __set($key, $value)
    {
        $trace = debug_backtrace();
        if(isset($trace[1]['class']) && in_array($trace[1]['class'], $this->__friends)) {
            return $this->$key = $value;
        }

        // normal __set() code here

        trigger_error('Cannot access private property ' . __CLASS__ . '::$' . $key, E_USER_ERROR);
    }
}

(Kod nerdclub nokta net on bugs.php.net de tsteiner kanıtlanmıştır)

Sana "korumalı" veya "özel", kullanımı durumda bağlı olduğu için aradığınızı eminim.

Eğer bir sınıfta bir işlevi tanımlayan konum ve sadece kendisi için kullanılabilir istiyorsanız, bunu bu şekilde tanımlarsınız:

private function foo($arg1, $arg2) { /*function stuff goes here */ }

Eğer bu şekilde bu sınıftan miras alan sınıflar için kullanılabilir, ancak mevcut değil alenen, bu kesin istediğiniz bir sınıfta bir işlevi tanımlayan iseniz:

protected function foo($arg1, $arg2)

Ben PHP5 varsayılan olarak, işlevleri aşağıdaki sözdizimini kullanmak zorunda değilsiniz, yani kamu olduğundan eminim, ama bu isteğe bağlı:

public function foo($arg1, $arg2) { /*function stuff goes here */ }

Hala bir kamu işlevini kullanmadan önce nesne örneğini gerekecek. Ben sadece tam olmalı ve bir nesneyi başlatmasını olmadan bir sınıftaki bir fonksiyonu kullanmak için, aşağıdaki sözdizimini kullandığınızdan emin olmasını bildireceğiz:

static function foo($arg1, $arg2) { /*function stuff goes here */ }

Yani aşağıdaki gibi sadece sınıf başvurarak işlevi kullanmak için izin verir:

MyClass::foo($a1, $a2);

Aksi takdirde, aşağıdakileri yapmanız gerekir:

$myObject = new MyClass();
$myObject->foo($a1, $a2);