Php class const


Определение константы

Класс может привязывать к своему контексту не только переменные и методы. Иногда требуются значения, которые невозможно изменить за весь жизненный цикл объекта.

Для этих целей PHP позволяет определять константы внутри классов. Выражение в общем виде можно записать как «const ИМЯ_КОНСТАНТЫ = значение_константы;». Обратите внимание, что определение происходит с использованием ключевого слова const. Функция define(), применяемая в работе с обычными константами, здесь бесполезна.

 //Определяем класс "Сообщение об ошибке" class ErrorMessage {  //Определяем константу с сообщением  const INPUT_ERROR = 'Ошибка ввода!'; }

Заметка
Существуют устоявшиеся правила именования констант. Все буквы, входящие в её имя, должны быть записаны верхним регистром, а слова отделены друг от друга символом подчеркивания.

Доступ к значению

Получить значение константы можно как внутри класса, так и снаружи. У них нет модификаторов доступа, так как попытка изменения значения в любом случае вызывает фатальную ошибку.


Ранее мы говорили, что с классами невозможно взаимодействовать, так как они являются шаблонами. Это не совсем правда. Константы привязываются именно к классу, и получить их значения можно без создания объекта. В PHP данное поведение осуществляется с помощью оператора разрешения области видимости. Он записывается с помощью двух двоеточий «::».

Получение доступа к значению константы, без создания экземпляра класса, можно записать в виде следующего выражения «ИмяКласса::ИМЯ_КОНСТАНТЫ;». Если у вас уже есть созданный объект, то замените имя класса на имя переменной, содержащей его.

 //Определяем класс "Палитра цветов" class ColorsPalette {  //Определяем константы цветов  const BLACK = 'Черный цвет';  const WHITE = 'Белый цвет'; }  //Доступ к значению константы без //создания объекта echo ColorsPalette::BLACK; //Результат: Черный цвет  //Создаем объект и выводим значение //константы через него $palette = new ColorsPalette(); echo $palette::WHITE; //Результат: Белый цвет

Для получения значения константы внутри метода необходимо использовать специальную переменную $this. Она будет содержать ссылку на объект, после его создания.

 //Определяем класс "Кусочек земли" class VolcanicEarth {  //Определяем константу типа  const TYPE = 'Незастывшая магма';   //Метод доступа и вывода значения  public function showEarthType()  {  echo 'Тип земли: '. $this::TYPE;  } }  //Создаем объект и выводим сообщение //на экран $earth = new VolcanicEarth(); $earth->showEarthType(); /* * Результат: * Тип земли: Незастывшая магма */


coder-booster.ru

Я знаю, что вы можете создавать глобальные константы в терминах друг друга с помощью конкатенации строк:

define('FOO', 'foo'); define('BAR', FOO.'bar'); echo BAR; 

напечатает «foobar».

  • Как извлечь значение поля из формы PDF в PHP

  • Класс pagination PHP
  • PHP PDO-MYSQL: как использовать соединение с базой данных в разных классах
  • Php: singleton VS полный статический класс? Когда используете что?
  • PHP-класс не найден

Тем не менее, я получаю сообщение об ошибке, пытающееся сделать то же самое с использованием констант класса.

 class foobar { const foo = 'foo'; const foo2 = self::foo; const bar = self::foo.'bar'; }  

foo2 определяется без проблем, но объявление const bar приведет к ошибке

Ошибка анализа: синтаксическая ошибка, неожиданные '.', Ожидающие ',' или ';'

Я также пытался использовать такие функции, как sprintf (), но он не похож на левый парн больше, чем на конкатенатор строки.


Так есть ли способ создания констант класса в терминах друг друга в чем-то более чем тривиальном случае набора, таком как foo2?

ruphp.com

Most people miss the point in declaring constants and confuse then things by trying to declare things like functions or arrays as constants. What happens next is to try things that are more complicated then necessary and sometimes lead to bad coding practices. Let me explain...


A constant is a name for a value (but it's NOT a variable), that usually will be replaced in the code while it gets COMPILED and NOT at runtime.

So returned values from functions can't be used, because they will return a value only at runtime.

Arrays can't be used, because they are data structures that exist at runtime.

One main purpose of declaring a constant is usually using a value in your code, that you can replace easily in one place without looking for all the occurences. Another is, to avoid mistakes.

Think about some examples written by some before me:

1. const MY_ARR = "return array("A", "B", "C", "D");";
It was said, this would declare an array that can be used with eval. WRONG! This is just a string as constant, NOT an array. Does it make sense if it would be possible to declare an array as constant? Probably not. Instead declare the values of the array as constants and make an array variable.

2. const magic_quotes = (bool)get_magic_quotes_gpc();
This can't work, of course. And it doesn't make sense either. The function already returns the value, there is no purpose in declaring a constant for the same thing.

3. Someone spoke about "dynamic" assignments to constants. What? There are no dynamic assignments to constants, runtime assignments work _only_ with variables. Let's take the proposed example:


<?php
/**
* Constants that deal only with the database
*/
class DbConstant extends aClassConstant {
    protected
$host = 'localhost';
    protected
$user = 'user';
    protected
$password = 'pass';
    protected
$database = 'db';
    protected
$time;
    function
__construct() {
       
$this->time = time() + 1; // dynamic assignment
   
}
}
?>

Those aren't constants, those are properties of the class. Something like "this->time = time()" would even totally defy the purpose of a constant. Constants are supposed to be just that, constant values, on every execution. They are not supposed to change every time a script runs or a class is instantiated.


Conclusion: Don't try to reinvent constants as variables. If constants don't work, just use variables. Then you don't need to reinvent methods to achieve things for what is already there.

php.net

PHP — это объектно-ориентированный язык, и возможностей у него в этом направлении очень много, и совершенно глупо их не использовать. Для тех, кто не знаком с ООП предлагаю почитать эту статью: ООП в JavaScript. Основой ООП является объект, а фабрикой для создания объектов является класс. И как раз о создании классов в PHP мы и поговорим в этой статье.

Класс состоит из следующих частей:

  1. Свойства.
  2. Конструктор.
  3. Методы.

Но прежде, чем добавлять все эти части давайте создадим описание класса (пусть файл называется «myclass.php«):

<?php
  class MyClass {

  }
?>


Здесь мы создали пустой класс с именем «MyClass«. Теперь добавим в наш класс свойства для нашего будущего объекта:

<?php
  class MyClass {
    public $x;
    public $y;
    const pi = 3.1415926;
  }
?>

Здесь мы создали три свойства (кстати, свойства иногда ещё называют полями). Обратите внимание, что они доступны за пределами класса (модификатор доступа — «public«). Если бы вместо «public» был бы «private«, то они были бы доступны только внутри самого класса, а если «protected«, то в самом классе и в наследниках (дочерних классах). Впрочем, более подробно, мы поговорим о них в следующих статьях.

Также мы добавили одну константу. И обратите внимание, что перед именем константы нет знака «$«, то есть это не переменная, и этот знак ставить не надо.

Теперь создадим конструктор.

<?php
  class MyClass {
    public $x;
    public $y;
    const pi = 3.1415926;
    public function __construct($x, $y) {
      $this->x = $x;
      $this->y = $y;
      echo "Был создан объект с параметрами: $x и $y";
    }
  }
?>


Конструктор в PHP — это функция __construct(). Этой функции мы можем передавать параметры, которые затем каким-либо образом использовать. В данном случае, мы получили параметры из конструктора и записали их в свойства класса. Обратите внимание, что обращение к свойствам класса надо обращаться через $this->имя_ свойства. Также мы вывели строку просто для того, чтобы Вы понимали, что в конструкторе Вы можете делать всё, что пожелаете (как в обычной функции).

Теперь перейдём к последнему пункту созданию класса — это добавление методов. Добавим метод, который считает и возвращает сумму свойств x и y, а также метод, возвращающий константу pi:

<?php
  class MyClass {
    public $x;
    public $y;
    const pi = 3.1415926;
    public function __construct($x, $y) {
      $this->x = $x;
      $this->y = $y;
      echo "Был создан объект с параметрами: $x и $y";
    }
    function sum() {
      $sum = $this->x + $this->y;
      return $sum;
    }
    function getPI() {
      return self::pi;
    }
  }
?>

Здесь всё очень просто: создаём переменную, в которую записываем сумму двух свойств: x и y. Потом возвращаем результат. Второй метод возвращает константу. Обратите внимание, что мы обращаемся с помощью такой конструкции: «self::имя_константы«. Так обращаются к константе внутри класса.

А теперь главный вопрос: «Как использовать данный класс в PHP?». Для этого создаём ещё один файл, в котором пишем такой код:

<?php
  require_once "myclass.php";
  $myobj = new MyClass(15, 17);
  echo "<br />";
  echo $myobj->x;
  echo "<br />";
  echo $myobj->y;
  echo "<br />";
  echo MyClass::pi;
  echo "<br />";
  echo $myobj->sum();
  echo "<br />";
  echo $myobj->getPI();
?>

Здесь мы сначала подключили наш класс, потом создали объект, передав конструктору параметры (15 и 17). Затем начали выводить свойства. Как видите, синтаксис такой: «имя_объекта->имя_свойства«. Безусловно, данные свойства будут выводиться только если они public, а если они являются private или protected, то, соответственно, Вы увидите ошибку. Также обратите внимание на вывод константы: «имя_класса::имя_константы«.

Затем мы используем два метода (sum() и getPI()) и печатаем возвращаемые ими значения.

Если Вы впервые знакомитесь с ООП, то, думаю, что сейчас Вы в шоке. И это неудивительно, ведь тема эта очень сложная, и по ней пишут целые тома. Я постараюсь в дальнейших статьях раскрыть эту тему, чтобы Вы поняли преимущество ООП, ведь почти все, кто пишет большие скрипты на PHP используют ООП, и без него действительно трудно обойтись. А если Вы делаете небольшие скрипты, то тогда ООП использовать совсем необязательно. Но поверьте моему опыту, что если Вы будете серьёзно программировать (необязательно на PHP), то ООП Вы будете использовать в будущем на полную катушку, и я постараюсь Вам дать тот фундамент, ту базу, от которой Вы сможете уже повышать свой уровень знаний по этой теме.

myrusakov.ru

Пример указания констант в классе

Вот пример класса с тремя константами:

<title>Константы в классе PHP</title> <?php class Goods  { 	const BOOKS	= 1; 	const DVD	= 2; 	const TOYS	= 3; 	 	public function SayGoods() 	{ 		echo self::BOOKS; 	} }  Goods::SayGoods();

Обратите внимание, перед именем константы мы не ставили знак $, этим константы отличаются от обычных свойств.

Также обратите внимание, что мы получили доступ к этой константе используя ключевое слово self и оператор «::«.

Попытка обратиться к константе используя псевдопеременную $this, то есть таким образом $this->BOOKS, приведёт к ошибке.

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

<title>Константы в классе PHP</title> <?php class Goods  { 	const BOOKS	= 1; 	const DVD	= 2; 	const TOYS	= 3; 	public $age	= 12; 	 	public function SayGoods() 	{ 		echo self::BOOKS; 		echo $this->age; 	} }  Goods::SayGoods();

Получаем сообщение «Using $this when not in object context in …». Так и должно быть, так как мы обратились к методу класса напрямую, не создавая объект, а $this работает только в контексте объекта.

Ещё раз: ключевое слово self предназначено только для обращения к константе из метода класса. Оно является аналогом псевдопеременной $this для доступа к свойствам.

<title>Константы в классе PHP</title> <?php class Goods  { 	const BOOKS	= 'книга'; 	public $age	= 12; 	 	public function SayGoods() 	{ 		echo "Метод говорит: ".self::BOOKS; 		# echo self::age; // ошибка - нет константы age 	} }  Goods::SayGoods();  $InstanceGoods = new Goods(); echo "<br>".$InstanceGoods->BOOKS;			// так не работает echo "<br>Доступ через объект: ".$InstanceGoods::BOOKS;	// так мы получаем доступ к константе echo "<br>Доступ: напрямую: ".Goods::BOOKS;		// так мы получаем доступ к константе ?>   <pre> 	код: <?php print_r($InstanceGoods); ?> </pre> 

Константы недоступны объектам. Это лекго понять на следующем примере.

<title>Константы в классе PHP</title> <?php class Goods  { 	const BOOKS	= 'книга'; 	const DVD	= 'диск'; 	const TOYS	= 'игрушка'; 	public $age	= 12; }  $Goods = new Goods(); print_r($Goods);

В нашем объекте есть только свойтво $age. Констант в нём нет.

Объект состоит только из свойств, также используя его можно получить доступ к методам. Если добавить в класс метод, то в print_r() мы это не увидим.

komotoz.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.