Temel sözdizimi için çözüm çözümlü olmamak

4 Cevap php

Ben eşittir işaretinin sağ tarafında yer alacak bir ifade için izin bir sınıf özelliği olmasını istiyorum. Tüm aşağıdaki kodu PHP choke sürümleri, ancak gelecekte daha kolay extendibility sağlamak için bu şekilde yazılmıştır.

/* Example SDK Class */
class SDK
{
    /* Runtime Option Flags */
    // Strings
    #  0: Makes no change to the strings.
    var $STRING_NONE        = (1 << 0);
    #  1: Removes color codes from the string.
    var $STRING_STRIP_COLOR = (1 << 1);
    #  2: Removes language codes from the string.
    var $STRING_STRIP_LANG  = (1 << 2);
    #  3: Removes all formatting from the string.
    var $STRING_STRIP       = SELF::STRING_STRIP_COLOR & SELF::STRING_STRIP_LANG;
    #  4: Converts color codes to HTML & UTF-8.
    var $STRING_HTML        = (1 << 3);
    #  8: Converts color codes to ECMA-48 escape color codes & UTF-8.
    var $STRING_CONSOLE     = (1 << 4);
    # 16: Changes player names only.
    var $STRING_NAMES       = (1 << 5);
    # 32: Changes host names only.
    var $STRING_HOSTS       = (1 << 6);
    function SDK($fString = SELF::STRING_HTML & SELF::STRING_NAMES & SELF_HOST)
    {
        // constructor code.
    }
}

$SDK &= new SDK(SDK::STRING_NONE);

(1 << 0) benim için çok temel bir sözdizimi gibi görünüyor, ve PHP böyle bir şey için izin vermedi, neden fathomable değildir. Okunabilirliği ve aşağıdaki kod gelecekteki genişleme korumak olacağını herkes etrafında bir iş düşünebiliyor musunuz?

4 Cevap

PHP bir sınıf veya sabit mal beyanında zaman sadece varsayılan değerler için ilkel değerleri belirleyebilirsiniz. Yani örneğin, bu sınıf bildirimi çalışmaz:

class TEST {
 const ABC = 2 * 4;
 const DEF = some_function();
 static $GHI = array(
   'key'=> 5 * 3,
 );
}

Ama bu sınıf bildirimi olacak:

class TEST {
 const ABC = 8;
 static $GHI = 15;
}

: Her zaman bir ifadenin sonuçları ile diğer değişkenler başlatabilirsiniz - Bu kurallar default values for class constants/properties uygulamak

$a= array(
 'a'=> 1 * 2,
 'b'=> 2 * 2,
 'c'=> 3 * 2,
);

Aşağıdaki gibi sınıf bildirimi davranışın nedeni: ifadeler fiiller gibidir. Onlar do something. Sınıflar isimler gibi: onlar declare something. Bir bildirime deyim bir eylem deyimi yan etkileri üretmek asla. İlkel varsayılan değerler gerektiren bu kuralı uygular.

Aşağıdaki gibi Bu düşünceyle biz orijinal sınıf refactor:

class SDK
{

    static protected $_types= null;

    static public function getType($type_name) {
        self::_init_types();
        if (array_key_exists($type_name, self::$_types)) {
            return self::$_types[$type_name];
        } else {
            throw new Exception("unknown type $type_name");
        }
    }

    static protected function _init_types() {
        if (!is_array(self::$_types)) {
            self::$_types= array(
                'STRING_NONE'=> 1 << 0,
                // ... rest of the "constants" here
                'STRING_HOSTS'=> 1 << 6
            );
        }
    }

    function __construct($fString = null) {
        if (is_null($fString)) {
            $fString= self::getType('STRING_NONE') & self::getType('STRING_HOSTS');
        }
        var_dump($fString);
    }

}

$SDK &= new SDK(SDK::getType('STRING_HOSTS')); 

PHP sınıfı özelliği can not bu beyanları bir ifade var.

[...] Bu bildiri bir başlatma içerebilir, fakat bu başlatma sabit bir değer olmalıdır - yani, bu derleme zamanında değerlendirilmesi gerekir ve must not depend on run-time information in order to be evaluated. [...]

Source: PHP Manual: Properties

Aşağıdaki kod bilgileri derleme zamanında tespit edilebilir ve herhangi bir matematiksel veya dize fonksiyonları bilgi almak yapmak, başka bir yerde bakmak için derleyici gerektirmez, iyi çalışır.

class goodExample
{
    // These are OK.
    var $Var = 1;
    const consts = 'I\'m a Constant Property of the class goodExample.';
    static $static = array(FALSE, TRUE);
}

Bu değeri true değer almak için ayrıştırılması gerekir olduğu gibi şu, diğer taraftan, geçerli değildir. Bu tüm PHP geçerli değil. var $Var, bir matematik işlemi gerektirir. const consts concations gerektirir ve bir işe yaramayacağını neden bu iki nedeni yüzden bir varable o değerini almak için bakmak. Son olarak, static özelliği $static gerçek değer elde etmek için iki matematik işlemlerini gerektirir.

class badExample
{
    // These are NOT OK.
    var $Var = 1 + 1;
    const consts = "I'm a constant property of the class " . __CLASS__ . '.';
    static $static = array((1 << 0), (1 << 2));
}

Consts & Static Keywords

Bu özellikleri bildirmek sonra, onların değerini can not değişim.

const

[...] Sabitler o you don't use the $ symbol to declare normal değişkenler farklı veya onları kullanmak.

Değer must be a constant expression, değil (örneğin) bir değişken, bir özellik, bir matematik işleminin bir sonucu veya bir işlev çağrısı.

Its also possible for interfaces sabitleri var.

Source: PHP Manual: Class Constants

static

Static sınıf örneğinin gerek kalmadan bunları erişilebilir kılan olarak [...] sınıf özelliklerini veya yöntemlerini bildirmek. Statik olarak bildirilen bir özelliği, bir örneklenmiş sınıf nesnesi (statik bir yöntem olabilir gerçi) ile ulaşılamaz.

Source: PHP Manual: Static Keyword

Static çok uzun sınıf adını başvurmak gibi, sınıfın dışında kullanılabilir.

Ben senin sorunun sadece orada tüm var s ile olduğunu düşünüyorum. Onlar muhtemelen tüm const ile değiştirilmesi gerekir. var üye değişkenleri bildirmek için PHP 4 gerekli idi, ama PHP 5 bir hataya neden olur. Siz PHP 5 olarak const, public, vb kullanarak olmalıdır yerine.

PHP (1 << 0) sorun const kullanarak olmalıdır zaman var kullanarak sırf yapmak mümkün. Ayrıca, self::VARIABLE statik değişkenler içindir, ve ben self::$variable (sen const olarak tanımlamak sürece olması gerektiğine inanıyoruz yapıyor