PHP - определить константу внутри класса


88

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

....что-то типа Foo::app()->MYCONSTANT;

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


3
у меня недавно была эта проблема stackoverflow.com/q/5710676/560299
Ibu

Ответы:


140

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

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, может быть какой-то неясный способ).
Аликс Аксель

3
(is_null(self::$staticVariable) === true) && (isset($value) === true)было бы намного лаконичнее self::$staticVariable === null && $value !== null. $valueвсегда будет устанавливаться внутри функции, поэтому использовать не нужно isset. А гипер-явное === trueничего не добавляет.
deceze

1
У нас был этот разговор раньше? Ничего не могу поделать, мне просто очень не нравится этот стиль. ;-D
deceze

@deceze: Да. Я очень привык к этому стилю, и он мне подходит, поэтому я буду его придерживаться, но ты тоже прав. =)
Аликс Аксель

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:

бар

Неустранимая ошибка: Неперехваченная ошибка: Невозможно получить доступ к закрытому 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 перед объявлением класса, и в этом случае ключевое слово предотвращает наследование класса.

Чтобы получить почти именно то, что искал Алекс, можно использовать следующий код:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.