Определение констант, свойств и методов класса
http://belarusweb.net
Основы создания сайтов

Определение констант, свойств и методов класса

Свойства и методы класса

В процессе создания класса в его теле могут создаваться константы, переменные или функции. Переменные, создаваемые внутри класса, принято называть свойствами, а функции методами этого класса (см. пример 6.2).

<?php
class my_class{       			//Объявили класс 
  const my_const='Строковая константа';   	//Создаем константу
  public $my_name;   			//Объявили, но неинициализировали свойство класса
 
  function set_name($text){   //Создаем метод класса, который устанавливает 
										//значение его свойства my_name 
    $this->my_name=$text;     //Ключевое слово $this ссылается на сам объект 
  } 
 }
 
$person=new my_class();       //Создали экземпляр класса, т.е. объект
$person->set_name('Иван');    //Установили значение его свойства my_name  
echo $person->my_name.'<br>'; //Выведет строку 'Иван' 
echo $person::my_const;       //Выведет 'Строковая константа'
?>

Пример 6.2. Определение свойств и методов класса

Константы классов, служебное слово const

Константы внутри классов создаются при помощи служебного слова const, после которого указывается имя константы и присваивается ее значение. Опять же, перед именем константы знак доллара '$' не ставится, а значением константы может быть только неизменяемое (скалярное) выражение, например, число, массив или строка, определенная при помощи синтаксиса nowdoc, но не переменная, результат вызова функции или что-то подобное.

Уровень доступа к свойствам и методам класса

Перед именем свойств и методов обычно указывается одно из следующих ключевых слов (модификаторов), определяющих уровень доступа к нему:

  • public – доступ к свойствам и методам класса разрешен отовсюду;
  • protected – доступ к свойствам и методам класса разрешен из наследуемых и родительских классов;
  • private – доступ к свойствам и методам класса разрешен только внутри самого класса.

Методы, в которых уровень доступа при помощи перечисленных модификаторов не указан, определяются как public.

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

Доступ к свойствам, методам и константам класса

После того, как какой-либо объект класса будет создан, свойства и методы класса становятся доступны для использования через указание имени объекта, объектного оператора '->', а также имени свойства или метода. Однако следует помнить, что при обращении к свойству объекта знак доллара '$' перед ним нужно опускать, а при вызове метода объекта нужно указывать круглые скобки. Доступ к константам, после создания экземпляра класса, отличается от доступа к свойствам или методам и осуществляется при помощи оператора двойного двоеточия '::' (см. пример 6.2).

Псевдопеременная $this

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

Псевдопеременная $this всегда указывает на текущий объект, поэтому присвоение ей какого-либо значения недопустимо.

Контроль типа аргументов методов класса

По умолчанию методы могут принимать аргументы любого типа. Однако иногда возникает необходимость сделать так, чтобы метод мог принимать в качестве аргументов, например, только массивы или же экземпляры какого-то определенного класса. В таких случаях следует просто указать разрешенный тип данных перед именем аргумента (см. пример 6.3).

<?php
class my_class{
   function test(other_class $arg){				//Первый аргумент метода должен быть
															//экземпляром класса other_class
      echo $arg->my_var;
   }
	function test_array(array $arg_1,$arg_2){ //Первый аргумент должен быть
      echo $arg_1[0].' '.$arg_2;					//массивом, второй любой доступный
	}
}    

class other_class{							//Создаем еще один класс
   public $my_var = 'Привет!'.'<br>';	//и определяем в нем свойство
}

$obj=new my_class();  			 			//Создаем экземпляр класса my_class
$other_obj=new other_class(); 			//Создаем экземпляр класса other_class

$obj->test($other_obj);						//Выведет строку 'Привет'
//$obj->test(7);								//Выведет ошибку, т.к. передан недопустимый 								 
												//тип данных (число вместо экземпляра класса)
$arr=['a','b','c'];			//Определяем массив
$obj->test_array($arr,5);	//Выведет строку 'a 5'
//$obj->test_array(5,$arr);//Выведет ошибку, первый аргумент должен быть массивом
?>

Пример 6.3. Осуществление контроля типа аргументов

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

Статические свойства и методы классов,
ключевое слово static

Отметим, что в PHP имеется возможность обращаться к свойствам и методам класса без объявления его экземпляров, т.е. без создания объектов соответствующего типа. Для этого они должны быть объявлены статическими при помощи ключевого слова static (см. пример 6.4).

<?php
class my_class{       						//Объявили класс 
  static public $my_text='Текст ';   	//Объявили статическое свойство класса
   
  static function get_func(){  			//Создаем статический метод класса
  	echo 'Функция'.'<br>';					//Выведет строку 'Функция'
	//$this->my_name='text'; - $this недопустимо в статических методах 
  } 
} 
echo my_class::$my_text.'<br>';  //Выведет строку 'Текст' без создания объекта
$a='my_class';  			  			//Присвоили имя класса переменной
echo $a::$my_text.'<br>'; 		   //Также выведет строку 'Текст'

my_class::get_func();	  //Выведет строку 'Функция'
$a::get_func(); 			  //Также выведет строку 'Функция'

$person=new my_class();   //Создали экземпляр класса, т.е. объект

$person::get_func();    //В обоих случаях выведет 'Функция', т.к. статические 
$person->get_func();    //методы доступны в объектах при помощи оператора '->' 

echo $person::$my_text;  //Выведет строку 'Текст' 
//echo $person->my_text;  //Выведет ошибку!!! Статические свойства недоступны 
								  //в объектах при помощи объектного оператора '->' 
?>

Пример 6.4. Использование ключевого слова static

Доступ к статическим свойствам и методам класса, как и в случае с константами класса, осуществляется при помощи оператора двойного двоеточия '::'. Однако при доступе к статическому свойству нужно указывать перед его идентификатором знак доллара, иначе интерпретатор будет пытаться получить доступ не к статическому свойству, а к константе класса. Кроме того, обращение к статическим свойствам при помощи объектного оператора '->' невозможно. Что касается статических методов, то при обращении к ним при помощи объектов разрешается использовать как двойное двоеточие '::', так и объектный оператор '->', хотя мы будем всегда использовать только двойное двоеточие (см. пример 6.4).

Как и в случае с константами, значением статического свойства может быть только неизменяемое (скалярное) выражение, например, число, массив или строка, определенная при помощи синтаксиса nowdoc, но не переменная, результат вызова функции или что-то подобное. Кроме того, поскольку статические методы могут вызываться без создания экземпляра класса, то псевдопеременная $this не доступна внутри метода, объявленного статическим, даже в случае, когда он вызывается изнутри объекта.

Обращение к объектам посредством переменных

Также отметим, что в PHP разрешается ссылаться на класс посредством переменных (наподобие концепции переменных функций). Соответственно, значение переменной в таком случае не должно являться ключевым словом PHP (см. пример 6.4).