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 MYCONSTANT
görmezden gelinmesi istenirse)
Yanıtlar:
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 MYCONSTANT
kendisi 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"
(is_null(self::$staticVariable) === true) && (isset($value) === true)
olarak çok daha kısa ve öz olacaktır self::$staticVariable === null && $value !== null
. $value
her zaman işlevin içinde ayarlanır , bu nedenle kullanmaya gerek yoktur isset
. Ve hiper-açık olan === true
hiçbir şey eklemez.
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
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()->BAR
iş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
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();
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
, private
veyaprotected
) .
Geçici bir çözüm, sabitinizi private
veya olarak tanımlamak protected
ve 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