Welcome to php club

PHP FAQ from PHPclub.ru: OOP/Properies ...

Начало | Каталог | Изменения | НовыеКомментарии | Вам запрещён доступПользователи | Вам запрещён доступРегистрация | Вход:  Пароль:  

Свойства в классах PHP. Property (properies) in PHP classes (like C#)


Отличием языка C# от большинства других языков является наличие понятия свойства.


Свойство отражает ту или иную черту (аспект) класса. Часто, хотя не всегда, это просто значение поля с почти идентичным
именем. Если бы мы сделали поле доступным для всех остальных объектов, тогда они могли бы читать это поле и записывать в него.
Введя в класс свойство, мы защищаем поле, контролируя доступ к нему извне. Такая методика носит название инкапсуляции.


Инкапсуляция – сокрытие внутренней структуры данных и реализации методов объекта от остальной программы. Другим объектам доступен только интерфейс объекта, через который осуществляется все взаимодействие с ним.лат.In – в + Capsula – ящичек.


Ниже приведён простой пример использования свойств в C#.


using System;


namespace Properties
{

class TestProperties
{
private string name;
/// <summary>
/// Определение свойства
/// </summary>
public string Name
{
/// <summary>
/// Тело метода get определяет, что происходит, когда
/// используется идентификатор свойства, например, с правой стороны
/// операции присваивания или в качестве аргумента метода
/// </summary>
set { name = value;}


/// <summary>
/// Тело метода set определяет, что происходит, когда
/// используется идентификатор свойства, например, с левой стороны
/// операции присваивания. В определении свойства должен присутствовать
/// хотя бы один из методов (или оба)
/// </summary>
get { return name; }
}
}

class Program
{

private void Go()
{
TestProperties obj = new TestProperties();
obj.Name = “Hello, world!”;
Console.WriteLine(obj.Name);

}
static void Main()
{

new Program().Go();
}
}

}

PHP4


В PHP 4.x.x механизма свойств нет. И обычно используют для доступа к полям следующие способы:


  1. $obj->property
  2. $obj->getProperty(); & $obj->setProperty(value);
  3. $obj->get('property'); & $obj->set('property', 'value');
  4. $obj->Property(); & $obj->Property('value');

Понятно, что 1) удобен в случае, если свойства являются простыми типами данных и не требуют проверок или каких либо действий над ними при чтении/записи, либо если в будущем понадобиться переходить на PHP 5.x.x, в котором есть get/set методы.


Пример:

<?php
class  TestClass  

    var 
$val


$obj      = new TestClass
$obj->val 'Hello, world'
echo 
$obj->val;
?>


Варианты 2) и 3) предназначены либо для предварительной обработки свойств, либо для private/protected свойств.
4) Позволяет писать вместо двух один метод (см. пример ниже).


Пример:

<?php
class  TestClass  

    var 
$_val;     
     
    function 
setVal($str null)  
    { 
        if (
is_string($str)) { 
            
$this->_val $str;  
        }        
    }
     
    function 
getVal()  
    { 
        return 
$this->_val;      
    }
             


$obj = new TestClass
$obj->setVal('Hello, world'); 
echo 
$obj->getVal();
?>


Пример:

<?php
class  TestClass  

    var 
$_val;     
     
    function 
Val($str null)  
    { 
        if (
is_string($str)) { 
            
$this->_val $str;  
        }        
         return 
$this->_val;
    }      
       
    } 


$obj = new TestClass
$obj->Val('Hello, world'); 
echo 
$obj->Val();
?>

PHP5


В PHP 5.x.x как вызовы методов, так и операции доступа к свойствам могут быть перегружены с использованием методов __call(),
__get() и __set(). Что позволяет нам эмулировать свойства аля C# в PHP!


Пример:

<?php
class A
{
    protected 
$_prop;
    protected 
$_anotherProp;

    function 
__get($name)
    {
        
$method 'get'.ucfirst($name);
        return 
method_exists($this$method)
                ? 
$this->$method()
                : 
$this->{'_'.$name};
    }

    function 
__set($name$value)
    {
        
$method 'set'.ucfirst($name);
        if (
method_exists($this$method)) {
            
$this->$method($value);
        } else {
            
$this->{'_'.$name} = $value;
        }
    }
    
    function 
getProp()
    {
        return 
$this->_prop;
    }
    
    function 
setProp($value)
    {
        
$this->_prop $value;
    }
}
    
?>

Информационные ресурсы


  1. http://php.net
  2. Темы на форуме http://phpclub.ru
    1. Свойства в стиле C#
    2. Доступ с свойствам класса
    3. Как называется подход в ООП?
  3. http://php5.ru
  4. ЖЖ demiurg


 
Комментариев нет. [Показать комментарии/форму]