belarusweb.net
© Петр Романовский Минск, 2016-2017.



belarusweb.net

Основы создания сайтов...

PHP+MySQL >>>

                          Учебник Задачник Справочник

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

В процессе создания класса в его теле могут создаваться константы, переменные или функции. Переменные, создаваемые внутри класса, принято называть свойствами, а функции методами этого класса (см. пример 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, после которого указывается имя константы и присваивается ее значение. Опять же, перед именем константы знак доллара '$' не ставится, а значением константы может быть только неизменяемое (скалярное) выражение, например, число, массив или строка, определенная при помощи синтаксиса nowdoc, но не переменная, результат вызова функции или что-то подобное.

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

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

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

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

Для обращения изнутри текущего метода к другим свойствам или методам внутри этого же класса используется специальная псевдопеременная $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. Осуществление контроля типа аргументов

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

Отметим, что в 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).

Контрольные вопросы и задания

  1. Что называют свойствами и методами класса? Как создаются константы классов?
  2. Каким образом осуществляется доступ к свойствам, методам и константам класса после создания его экземпляров?
  3. Для чего используется псевдопеременная $this?
  4. Как и для чего создаются статические свойства и методы?

Словарь новых английских слов

one-off [wʌnˈɒf] – одноразовый.
partial [ˈpɑːʃ(ə)l] – частичный.
class [klɑːs] – класс.
new [njuː] – новый.
empty [ˈempti] – пустой.
constant [ˈkɒnst(ə)nt] – константа.
person [ˈpəːs(ə)n] – личность, персона.
object [ˈɒbdʒɪkt] – объект.
method [ˈmɛθəd] – метод.
property [ˈprɒpəti] – свойство.
public [ˈpʌblɪk] – открытый, общественный.
protected [prəˈtektɪd] – защищенный.
private [ˈprʌɪvət] – закрытый, частный.
this [ðɪs] – это, этот.
static [ˈstatɪk] – статичный, неподвижный.
extend [ɪkˈstɛnd] – расширять.
self [self] – собственный.
parent [ˈpɛːr(ə)nt] – родитель, предок.
exit [ˈeksɪt] – выход, выйти.
nest [nest] – вставлять один предмет в другой.
final [ˈfʌɪn(ə)l] – заключительный, окончательный.
construct [kənˈstrʌkt] – создавать, конструировать.
destruct [dɪˈstrʌkt] – разрушать, уничтожать.
descendant [dɪˈsɛnd(ə)nt] – потомок.
abstract [ˈæbstrækt] – абстрактный, отвлеченный.
interface [ˈɪntəfeɪs] – интерфейс, область контакта.
implement [ˈɪmplɪment] – осуществлять, реализовывать.
trait [treɪt] – особенность, черта.
use [ˈjuːs] – употреблять, использовать.
instead [ɪnˈstɛd] – вместо, взамен.
as [æz] – как.
anonymous [əˈnɒnɪməs] – безымянный, анонимный.
clone [kləʊn] – клон, двойник.
set [set] – устанавливать.
unset [ʌnˈsɛt] – удалять.
get [ɡet] – получать.
call [kɔːl] – вызывать, звать.

Комментарии (0)
Петр Романовский
1. Приветствуются комментарии, которые содержат дополнения к материалу текущей страницы, а также ваши ответы на вопросы других пользователей.
2. Если вам что-то непонятно - спрашивайте, не забывая написать, что именно и с какого места.
Показаны все комментарии
Чтобы оставить свой комментарий, авторизуйтесь, пожалуйста!    
     
belarusweb.net © Петр Романовский, Минск, 2016-2017.
Связаться с автором
Наверх