Рейтинг@Mail.ru
 
Пространство имен

Ну с мертвой точки я думаю сдвинулись, продолжим. Одним из наиболее уместных на мой взгляд способов применения классов, является пространство имен. Что опять за непонятные термины? Это всего навсего расширенное понятие функции. Вспомните про жирафа, очень удобно написать функцию один раз, а потом пользоваться ей в разных местах. Так же и класс, используемый как отдельная программа, достаточно удобен. Отличие от функции очевидно - в классе может быть несколько функций. И они могут взимодействовать между собой.

Другими словами иногда очень полезно написать отдельную программу (класс или несколько), которую можно использовать в разных модулях.

И так, что же это такое - пространство имен. Простой пример. Допустим нам нужно сделать интересное приветствие, что бы посетителю небыло скучно. Возьмем класс, который у нас уже есть и немного изменим его:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php

    
class My_first_class  
    
{  
         
        var 
$hello   = array( 
                               
'Привет'
                               
'Салют'
                               
'Хай',  
                               
'Улыбнись',
                               
'Рады видеть тебя'     
                             
); 
         

                                      
        function 
__construct($name)  
        {  
            
$this->name $name;     
        } 
         
       
          
        function 
helloUser()  
        {  
            return 
$this->hello[$this->random($this->hello)] .', '$this->name .'!'
        }  
                 
         
        function 
random($arr
        { 
            return  
rand(0count($arr) - 1); 
        }                   
    }  
      

    
$name 'Денис';  
      
    
$obj = new My_first_class($name);  
          
    echo 
$obj -> helloUser(), '<br>'


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

Но самое главное в другом. У нас появился метод random() Этот метод выдает случайное число в диапазоне от 0 до количества элементов массива минус один. То есть позволяет выбрать случайное приветствие. Это все хорошо, но суть не в том. Суть в том, что сочиняя такую функцию, первое имя для неё, которое приходит на ум - именно random() Так вот, если разработчиков несколько, то и функций с таким названием может оказаться несколько. Это внесет путаницу, а еще хуже - может вызвать конфликт. А при таком раскладе волноваться не о чем. Если нам нужна эта функция (метод), мы сначала определяем принадлежность, потом вызываем из нужного класса.

То есть класс помогает разграничить область видимости, создав локальное пространство имен для функций и переменных. Теперь, что бы сделать приветствие, не обязателен даже метод, можно просто взять нужные переменные из класса:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

    
class My_first_class  
    
{  
         
        static 
$hello   = array( 
                               
'Привет'
                               
'Салют'
                               
'Хай',                                
                               
'Улыбнись',                                
                               
'Рады видеть тебя'                 
                             
); 
       
                                              
         
        static function 
random($arr
        { 
            return 
rand(0count($arr) - 1); 
        }                   
    }  
      

    
$name 'Денис';  
   
   
$hello My_first_class::$hello
   
$rand My_first_class::random($hello); 
    
    echo 
$helo[$rand] .', '$name .'!';


То есть мы использовали класс, как контейнер для функций и переменных. Исключив тем самым возможность конфликта имен.

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

Но этод код тоже можно упростить. Дело в том, что совсем не обязательно передавать массив параметром в метод, он уже и так есть внутри класса. Так вот обратиться к статичной переменной внутри класса можно ключевым словом self, что ознаяает "местная":
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

    
class My_first_class  
    
{  
         
        static 
$hello   = array( 
                               
'Привет'
                               
'Салют'
                               
'Хай',                                
                               
'Улыбнись',                                
                               
'Рады видеть тебя'                 
                             
);
                                              
         
        static function 
random() 
        { 
            return 
rand(0count(self::$hello) - 1); 
        }                   
    }  
      

    
$name 'Денис';  
   
   
$hello My_first_class::$hello
   
$rand My_first_class::random(); 
    
    echo 
$hello[$rand] .', '$name .'!';


Можно пойти еще дальше, обратившись к методу точно так же как к переменной, посредством self
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

    
class My_first_class  
    
{  
         
        static 
$hello   = array( 
                               
'Привет'
                               
'Салют'
                               
'Хай',                                
                               
'Улыбнись',                                
                               
'Рады видеть тебя'                 
                             
);
                                              
        static function 
helloUser() 
        { 
            return 
self::$hello[self::random()]; 
        }           
                 
        static function 
random() 
        { 
            return 
rand(0count(self::$hello) - 1); 
        }                   
    }  
      

    
$name 'Денис';  
   
   
$hello My_first_class::helloUser(); 
    
    echo 
$hello .', '$name .'!';
Все просто и красиво.

Тут нужно подробнее остановиться на названиях классов и их местоположении. Что бы было легко ориентироваться в библиотеках, придумано так называемое "соглашение PEAR"
Следуя этим рекомендациям каждый класс нужно располагать в своем файле, который должен называться так же как класс. Еще в названии класса должен быть виден путь до файла, если класс в библиотеке не один. Допустим мы делаем библиотеку для работы с изображениями, в который входят классы ресайза, водных знаков, генерации графиков и т.д. Все они должны находиться в своем каталоге, к примеру pictures. Тогда класс ресайзера будет называться Pictures_Resizer, а водных знаков - Pictures_Watermark

Из названия класса видно, где его искать.

Ну а мы пойдем дальше, изучать инкапсуляцию.