PHP-클래스 내부에 상수 정의


88

클래스 내에서 상수를 정의하고 클래스 컨텍스트에서 호출 될 때만 표시되도록하려면 어떻게해야합니까?

.... 같은 것 Foo::app()->MYCONSTANT;

(그리고 MYCONSTANT무시되기를 원하면 )


3
최근에이 문제가 발생했습니다. stackoverflow.com/q/5710676/560299
Ibu

답변:


141

클래스 상수 참조 :

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"

하지만 클래스의 함수 내에서 정의하는 것은 작동하지 않습니다. :(
Alex

@Alex : 아니요 (AFAIK, 모호한 방법이있을 수 있음).
Alix Axel

3
(is_null(self::$staticVariable) === true) && (isset($value) === true)훨씬 더 간결합니다 self::$staticVariable === null && $value !== null. $value항상 함수 내부에 설정 되므로 사용할 필요가 없습니다 isset. 그리고 극도로 명시적인 === true것은 아무것도 추가하지 않습니다.
속임수

1
전에이 대화를 했나요? 어쩔 수 없어요. 그 스타일이 정말 싫어요. ;-D
deceze

@deceze : 네. 저는이 스타일에 매우 익숙하고 저에게도 효과가 있으므로 계속 고수 할 것입니다.하지만 당신도 옳습니다. =)
Alix Axel

24

이것은 오래된 질문이지만 이제 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부터 가시성 수정자는 클래스 상수에 허용됩니다.

여기에 더 많은 정보


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

echo Foo::BAR;

이것은 클래스 상수 를 만드는 유일한 방법 입니다. 이러한 상수는 항상를 통해 전역 적으로 액세스 할 수 Foo::BAR있지만을 통해서만 액세스 할 수는 없습니다 BAR.

다음과 같은 구문을 얻으려면 속성 이있는 클래스 Foo::baz()->BAR의 함수에서 객체를 반환해야 합니다 . 하지만 그것은 상수가 아닙니다. 정의한 모든 상수 는 항상 어디서나 전역 적으로 액세스 할 수 있으며 함수 호출 결과로 제한 할 수 없습니다.baz()Foo BAR


6

이것은 꽤 오래된 질문이지만 아마도이 답변은 여전히 ​​다른 사람을 도울 수 있습니다.

다음과 같이 미리 정의 된 값을 반환하는 메서드에 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();

3

PHP에서 클래스 상수를 정의 할 수 있습니다. 그러나 클래스 상수는 모든 개체 인스턴스에서도 액세스 할 수 있습니다. 이것은 PHP의 기능입니다. 그러나, 같은 php7.1 , 당신은 귀하의 클래스 상수 정의 할 수 있습니다 액세스 한정자 ( public, private또는 protected).

해결 방법은 상수를 private또는 로 정의한 protected다음 static function. 이 함수는 정적 컨텍스트에서 호출 된 경우에만 상수 값을 반환해야합니다.

부모 클래스에서이 정적 함수를 만들고 다른 모든 클래스에서이 부모 클래스를 상속하여 기본 기능으로 만들 수도 있습니다.

크레딧 : http://dwellupper.io/post/48/defining-class-constants-in-php

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.