PHP - bir sınıf içinde sabiti tanımlama


88

Bir sınıf içinde bir sabiti nasıl tanımlayabilirim ve onu yalnızca bir sınıf bağlamında çağrıldığında görünür olacak şekilde nasıl yapabilirim?

....gibi bir şey Foo::app()->MYCONSTANT;

(ve MYCONSTANTgörmezden gelinmesi istenirse)


3
Son zamanlarda bu sorunu
yaşadım

Yanıtlar:


141

Sınıf Sabitlerine Bakın :

class MyClass
{
    const MYCONSTANT = 'constant value';

    function showConstant() {
        echo  self::MYCONSTANT. "\n";
    }
}

echo MyClass::MYCONSTANT. "\n";

$classname = "MyClass";
echo $classname::MYCONSTANT. "\n"; // As of PHP 5.3.0

$class = new MyClass();
$class->showConstant();

echo $class::MYCONSTANT."\n"; // As of PHP 5.3.0

Yankılanan Bu durumda MYCONSTANTkendisi tarafından tanımlanmamış bir sabit ve çıkışı hakkında bir uyarı gündeme getireceğini sabit adı bir dizeye dönüştürülür: "MYCONSTANT".


DÜZENLEME - Belki de aradığınız şey şu statik özellikler / değişkenlerdir :

class MyClass
{
    private static $staticVariable = null;

    public static function showStaticVariable($value = null)
    {
        if ((is_null(self::$staticVariable) === true) && (isset($value) === true))
        {
            self::$staticVariable = $value;
        }

        return self::$staticVariable;
    }
}

MyClass::showStaticVariable(); // null
MyClass::showStaticVariable('constant value'); // "constant value"
MyClass::showStaticVariable('other constant value?'); // "constant value"
MyClass::showStaticVariable(); // "constant value"

ancak bunu sınıfın bir işlevi içinde tanımlamak işe yaramaz :(
Alex

@Alex: Hayır değil (AFAIK, belirsiz bir yol olabilir).
Alix Axel

3
(is_null(self::$staticVariable) === true) && (isset($value) === true)olarak çok daha kısa ve öz olacaktır self::$staticVariable === null && $value !== null. $valueher zaman işlevin içinde ayarlanır , bu nedenle kullanmaya gerek yoktur isset. Ve hiper-açık olan === truehiçbir şey eklemez.
kestirmek

1
Bu konuşmayı daha önce yaptık mı? Engel olamıyorum, bu tarzdan gerçekten hoşlanmıyorum. ;-D
deceze

@deceze: Evet. Bu stile çok alıştım ve benim için işe yarıyor bu yüzden ona bağlı kalacağım, ama sen de haklısın. =)
Alix Axel

24

Bu ve eski bir soru, ancak şimdi PHP 7.1'de sabit görünürlüğü tanımlayabilirsiniz.

MİSAL

<?php
class Foo {
    // As of PHP 7.1.0
    public const BAR = 'bar';
    private const BAZ = 'baz';
}
echo Foo::BAR . PHP_EOL;
echo Foo::BAZ . PHP_EOL;
?>

Yukarıdaki örneğin PHP 7.1 çıktısı:

bar

Önemli hata: Yakalanmamış Hata: Özel const Foo :: BAZ'a erişilemiyor…

Not: PHP 7.1.0'dan itibaren, sınıf sabitleri için görünürlük değiştiricilerine izin verilmektedir.

Daha fazla bilgi burada


11
class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;

Sınıf sabitleri yapmanın tek yolu budur . Bu sabitlere her zaman küresel olarak erişilebilir Foo::BAR, ancak bunlara yalnızcaBAR .

Böyle bir sözdizimi elde etmek için , bir özelliği olan sınıfın Foo::baz()->BARişlevinden bir nesne döndürmeniz gerekir . Yine de bu sabit değil. Tanımladığınız herhangi bir sabite her zaman global olarak her yerden erişilebilir ve işlev çağrı sonuçlarıyla sınırlandırılamaz.baz()Foo BAR


6

Bu oldukça eski bir sorudur, ancak belki bu cevap yine de başka birine yardımcı olabilir.

Final anahtar kelimesini önceden tanımlanmış bir değer döndüren bir yönteme uygulayarak, bir sınıf kapsamında kısıtlanmış bir genel sabiti taklit edebilirsiniz, örneğin:

class Foo {

    // This is a private constant
    final public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

Bir yöntemdeki final anahtar sözcüğü, genişleyen bir sınıfın yöntemi yeniden tanımlamasını engeller. Son anahtar kelimeyi sınıf bildiriminin önüne de yerleştirebilirsiniz, bu durumda anahtar kelime sınıf Devralmasını engeller.

Alex'in aradığı şeyi neredeyse tam olarak elde etmek için aşağıdaki kod kullanılabilir:

final class Constants {

    public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

class Foo {

    static public app()
    {
        return new Constants();
    }
}

Taklit edilen sabit değere şu şekilde erişilebilir:

Foo::app()->MYCONSTANT();

3

Php'de bir sınıf sabiti tanımlayabilirsiniz. Ancak sınıf sabitinize herhangi bir nesne örneğinden de erişilebilir. Bu php'nin işlevselliğidir. Ancak itibariyle php7.1 , sen ile sınıf sabitleri tanımlayabilirsiniz erişim değiştiricileri ( public, privateveyaprotected ) .

Geçici bir çözüm, sabitinizi privateveya olarak tanımlamak protectedve ardından bunları bir static function. Bu işlev, yalnızca statik bağlamdan çağrıldığında sabit değerleri döndürmelidir.

Bu statik işlevi ana sınıfınızda da oluşturabilir ve bu ana sınıfı diğer tüm sınıflardan miras alarak varsayılan bir işlevsellik haline getirebilirsiniz.

Krediler: http://dwellupper.io/post/48/defining-class-constants-in-php

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.