PHP - определить константу внутри класса - PullRequest
72 голосов
/ 05 мая 2011

Как я могу определить константу внутри класса и сделать так, чтобы она была видимой только при вызове в контексте класса?

.... что-то вроде Foo::app()->MYCONSTANT;

(иесли вызывается как MYCONSTANT, игнорируется)

Ответы [ 5 ]

115 голосов
/ 05 мая 2011

См. Константы класса :

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"
18 голосов
/ 12 августа 2016

Это старый вопрос, но теперь в 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 модификаторы видимости разрешены для констант классов.

Подробнее здесь

10 голосов
/ 05 мая 2011
class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;

Это единственный способ сделать константы класса . Эти константы всегда доступны глобально через Foo::BAR, но они не доступны только через BAR.

Чтобы получить такой синтаксис, как Foo::baz()->BAR, вам необходимо вернуть объект из функции baz() класса Foo, который имеет свойство BAR. Это не константа, хотя. Любая константа , которую вы определяете, всегда глобально доступна из любой точки мира и не может быть ограничена результатами вызова функции.

6 голосов
/ 29 марта 2013

Это довольно старый вопрос, но, возможно, этот ответ все еще может помочь кому-то еще.

Вы можете эмулировать открытую константу, которая ограничена в области видимости класса, применяя ключевое слово final к методу, который возвращаетпредопределенное значение, например:

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();
3 голосов
/ 13 ноября 2017

Вы можете определить константу класса в php. Но ваша константа класса также будет доступна из любого экземпляра объекта. Это функциональность php. Однако, начиная с php7.1 , вы можете определить свои константы класса с помощью модификаторов доступа (public, private или protected).

Обходным решением было бы определить вашу константу как private или protected, а затем сделать ее читаемой через static function. Эта функция должна возвращать значения констант только в случае вызова из статического контекста.

Вы также можете создать эту статическую функцию в своем родительском классе и просто наследовать этот родительский класс во всех других классах, чтобы сделать его функциональностью по умолчанию.

Кредиты: http://dwellupper.io/post/48/defining-class-constants-in-php

...