클래스 내에서 상수를 정의하고 클래스 컨텍스트에서 호출 될 때만 표시되도록하려면 어떻게해야합니까?
.... 같은 것 Foo::app()->MYCONSTANT;
(그리고 MYCONSTANT
무시되기를 원하면 )
답변:
클래스 상수 참조 :
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"
.
편집 -아마도 당신이 찾고있는 것은이 정적 속성 / 변수입니다 .
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)
훨씬 더 간결합니다 self::$staticVariable === null && $value !== null
. $value
항상 함수 내부에 설정 되므로 사용할 필요가 없습니다 isset
. 그리고 극도로 명시적인 === true
것은 아무것도 추가하지 않습니다.
이것은 오래된 질문이지만 이제 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에서 위 예제의 출력 :
바 치명적인 오류 : 포착되지 않은 오류 :…에서 private const Foo :: BAZ에 액세스 할 수 없습니다.
참고 : PHP 7.1.0부터 가시성 수정자는 클래스 상수에 허용됩니다.
여기에 더 많은 정보
class Foo {
const BAR = 'baz';
}
echo Foo::BAR;
이것은 클래스 상수 를 만드는 유일한 방법 입니다. 이러한 상수는 항상를 통해 전역 적으로 액세스 할 수 Foo::BAR
있지만을 통해서만 액세스 할 수는 없습니다 BAR
.
다음과 같은 구문을 얻으려면 속성 이있는 클래스 Foo::baz()->BAR
의 함수에서 객체를 반환해야 합니다 . 하지만 그것은 상수가 아닙니다. 정의한 모든 상수 는 항상 어디서나 전역 적으로 액세스 할 수 있으며 함수 호출 결과로 제한 할 수 없습니다.baz()
Foo
BAR
이것은 꽤 오래된 질문이지만 아마도이 답변은 여전히 다른 사람을 도울 수 있습니다.
다음과 같이 미리 정의 된 값을 반환하는 메서드에 final 키워드를 적용하여 클래스 범위 내에서 제한된 공용 상수를 에뮬레이션 할 수 있습니다.
class Foo {
// This is a private constant
final public MYCONSTANT()
{
return 'MYCONSTANT_VALUE';
}
}
메서드의 final 키워드는 확장 클래스가 메서드를 다시 정의하는 것을 방지합니다. 클래스 선언 앞에 final 키워드를 배치 할 수도 있습니다.이 경우 키워드는 클래스 상속을 방지합니다.
Alex가 찾던 것을 거의 정확하게 얻기 위해 다음 코드를 사용할 수 있습니다.
final class Constants {
public MYCONSTANT()
{
return 'MYCONSTANT_VALUE';
}
}
class Foo {
static public app()
{
return new Constants();
}
}
에뮬레이트 된 상수 값은 다음과 같이 액세스 할 수 있습니다.
Foo::app()->MYCONSTANT();
PHP에서 클래스 상수를 정의 할 수 있습니다. 그러나 클래스 상수는 모든 개체 인스턴스에서도 액세스 할 수 있습니다. 이것은 PHP의 기능입니다. 그러나, 같은 php7.1 , 당신은 귀하의 클래스 상수 정의 할 수 있습니다 액세스 한정자 ( public
, private
또는 protected
).
해결 방법은 상수를 private
또는 로 정의한 protected
다음 static function
. 이 함수는 정적 컨텍스트에서 호출 된 경우에만 상수 값을 반환해야합니다.
부모 클래스에서이 정적 함수를 만들고 다른 모든 클래스에서이 부모 클래스를 상속하여 기본 기능으로 만들 수도 있습니다.
크레딧 : http://dwellupper.io/post/48/defining-class-constants-in-php