Redeclaration olmadan sınıfta statik özelliklerini devralır?

1 Cevap php

Ben şu anda yazıyorum uygulama ile this guy gibi aynı sorunu yaşıyorum. Sorun Statik özellikler, alt sınıflar içinde miras olan değil, ve benim ana sınıfında statik :: anahtar kelimeyi kullanırsanız eğer öyleyse, o da benim ana sınıfında değişkeni ayarlar olmasıdır.

Benim sınıfta statik değişkenleri redeclare eğer çalışır, ama ben statik özellikleri ve alt sınıfları çok sayıda var ve kod tekrarını önlemek isteyen bekliyoruz. Ben bağlantılı sayfasında üst puan yanıtı birkaç "geçici çözümler" için bir bağlantı vardır, ama 404'd gibi görünüyor. Herkes bana biraz yardım borç ya da belki yönde bana gelin miyim geçici çözümler dedi?

1 Cevap

Ben bu konuda konuşurken ne özel çözüm emin değilim, ben çalışabilir epeyce düşünebilirsiniz. Ben şahsen herhangi bir kod, bu kullanmak olmaz. Sana Is it possible to overuse late static binding in PHP? bir göz atın tavsiye ve başarmak umut ne yapmak için daha iyi bir yolu varsa yeniden düşünmek istiyorum.

Ayrıca ben sadece burada yazdığım gibi benim kod tamamen denenmemiş olduğunu unutmayın.

Method 1: Always use an array to figure

Diğer tüm yöntemler, bu bir dayanmaktadır. Eğer statik özelliğini kullanın whereever, sen sınıfını tespit etmek ve bunu elde etmek için kodu eklemek. Eğer başka bir yerde özelliğini kullanmayı planlıyorsanız asla Ben sadece bu düşünecektim.

$class = get_called_class();
if(isset(self::$_names[$class])) {
    return self::$_names[$class];
}
else {
    return static::NAME_DEFAULT;
}

Method 2: Use a getter/setting methods

Eğer birden fazla noktada kullanılan sahip planlıyorsanız, bu yöntem daha iyi olurdu. Bazı tekiz desenleri benzer bir yöntem kullanır.

<?php
class SomeParent {
    const NAME_DEFAULT = 'Whatever defaults here';

    private static $_names = array();

    static function getName($property) {
        $class = get_called_class();
        if(isset(self::$_names[$class])) {
            $name self::$_names[$class];
        }
        else {
            $name = "Kandy"; // use some sort of default value
        }
    }

    static function setName($value) {
        $class = get_called_class();
        self::$_names[$class] = $value;
    }
}

Method 3: __callStatic

Bu kadar en uygun yöntemdir. Eğer (__get ve __ set statik kullanılamaz) kullanmak için bir nesne örneği olması gerekir ancak. Aynı zamanda, (diğer iki daha yavaş) yavaş bir yöntemdir. Ben zaten statik özelliklerini kullanarak konum beri bu zaten olmayan bir seçenek olduğunu tahmin ediyorum. (Bu yöntem sizin için çalışır Eğer statik özelliklerini kullanabilirsiniz olmasaydı, muhtemelen daha iyi olurdu)

<?php
class SomeParent {

    const NAME_DEFAULT = 'Whatever defaults here';

    private static $_names = array();

    function __get($property) {
        if($property == 'name') {
            $class = get_called_class();
            if(isset(self::$_names[$class])) {
                return self::$_names[$class];
            }
            else {
                return static::NAME_DEFAULT;
            }
        }
        // should probably trigger some sort of error here
    }

    function __set($property, $value) {
        if($property == 'name') {
            $class = get_called_class();
            self::$_names[$class] = $value;
        }
        else {
            static::$property = $value;
        }
    }
}