2011-05-05 20 views
48

如何在類中定義常量,並使其僅在類上下文中調用時纔可見?PHP - 在類中定義常數

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

(如果叫喜歡MYCONSTANT被忽略)

+3

我有這個問題最近http://stackoverflow.com/q/5710676/560299 – Ibu 2011-05-05 03:22:20

回答

81

Class Constants

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 

在這種情況下呼應本身MYCONSTANT將提高的通知關於一個未定義常量並輸出常量名稱轉換爲字符串:"MYCONSTANT"


編輯 - 你要找也許什麼是這個static properties/variables

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" 
+0

,但它不工作來定義它的類的函數內部:( – Alex 2011-05-05 03:17:41

+0

@Alex :不,它不會(AFAIK,可能有一些模糊的方式) – 2011-05-05 03:18:48

+0

@Alex:檢查我的編輯 – 2011-05-05 03:24:49

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

echo Foo::BAR; 

這是爲了類常量的唯一途徑。這些常量通過Foo::BAR可以全局訪問,但不能通過BAR訪問。

爲了實現像Foo::baz()->BAR語法,你需要從Foo類的功能baz()具有財產BAR返回一個對象。儘管如此,這還不是一個常數。您定義的任何常量始終可以從任何地方全局訪問,並且不能限制爲函數調用結果。

6

這是一個很老的問題,但也許這個答案仍然可以幫助別人。

您可以模仿通過將最後關鍵字來返回一個預先定義的值,這樣的方法的類範圍內受到限制的公共常數:上的方法防止

class Foo { 

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

最終關鍵字重新定義該方法的擴展類。 您還可以將final關鍵字放在類聲明的前面,在這種情況下,關鍵字會阻止類繼承。

要獲得近正是亞歷克斯一直在尋找下面的代碼可用於:

final class Constants { 

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

class Foo { 

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

的模擬定值會是這樣訪問:

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

這是老問題,但現在在PHP 7.1上,您可以定義持續的可見性。

<?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; 
?> 

輸出在PHP 7上面的例子中的。1:

 
bar 

Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in … 

注: 作爲PHP 7.1.0可見性修飾符的允許類常量。

更多信息here

0

您可以定義一個類在PHP不變。但是你的類常量也可以從任何對象實例訪問。這是php的功能。 但是,從php7.1,您可以用訪問修飾符public,privateprotected)定義您的類常量。

解決方法是將常量定義爲privateprotected,然後通過static function使其可讀。如果從靜態上下文中調用該函數,該函數應該只返回常量值。

您也可以在您的父類中創建此靜態函數,並簡單地繼承此類父類以使其成爲默認功能。

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