官术网_书友最值得收藏!

Using getters and setters

Yii has many features that came from other languages, such as Java or C#. One of them is defining properties with getters and setters for any of the class extended from CComponent (that is, virtually any Yii class).

From this recipe, you will learn how to define your own properties using getters and setters, how to make your properties read-only, and how to hide custom processing behind native PHP assignments.

How to do it...

  1. As PHP does not have properties at the language level, we can only use getters and setters in the following way:
    class MyClass
    {
        // hiding $property
        private $property;
        
        // getter
        public function getProperty()
        {
            return $this->property;
        }
        
        // setter
        public function setProperty($value)
        {
            $this->property = $value;
        }
    }
    
    $object = new MyClass();
    
    // setting value
    $object->setProperty('value');
    
    // getting value
    echo $object->getProperty();
  2. This syntax is very common in the Java world but it is a bit long to use in PHP. Still, we want to use the same functionality C# properties gives us: calling getters and setters like class members. With Yii, we can do it in the following way:
    // extending CComponent is necessary
    class MyClass extends CComponent
    {
        private $property;
    
        public function getProperty()
        {
            return $this->property;
        }
    
        public function setProperty($value)
        {
            $this->property = $value;
        }
    }
    
    $object = new MyClass();
    $object->property = 'value'; // same as $object->setProperty('value');
    echo $object->property; // same as $object->getProperty();
  3. Using this feature, you can make properties read-only or write-only while keeping the simple PHP syntax as follows:
    class MyClass extends CComponent
    {
        private $read = 'read only property';
        private $write = 'write only property';
    
        public function getRead()
        {
            return $this->read;
        }
    
        public function setWrite($value)
        {
            $this->write = $value;
        }
    }
    
    $object = new MyClass();
    
    // gives us an error since we are trying to write to read-only property
    $object->read = 'value'; 
    
    // echoes 'read only property'
    echo $object->read; 
    
    // gives us an error since we are trying to read to write-only property
    echo $object->write; 
    
    // writes 'value' to private $write
    $object->write = 'value';
  4. Yii uses this technique extensively because almost everything is a component. For example, when you are calling Yii::app()->user->id to get the currently logged in user ID, what's really called is Yii::app()->getUser()->getId().

How it works...

To use getters and setters like properties, CComponent uses the PHP magic methods: __get, __set, __isset, and __unset (http://php.net/manual/en/language.oop5.magic.php). The following example shows what Yii 1.1 CComponent::__get looks like:

public function __get($name)
{
   $getter='get'.$name;
   if(method_exists($this,$getter))
      return $this->$getter();
…

This magic PHP method intercepts all calls to missing real properties, so when we are calling $myClass->property, it receives property as $name parameter. If a method named getProperty exists, then PHP uses its return value as a property value.

There's more...

For further information, refer to the following URL:

http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members

See also

  • The recipe named Using Yii events in this chapter
  • The recipe named Configuring components in this chapter
主站蜘蛛池模板: 兴义市| 沈阳市| 盘山县| 武城县| 繁昌县| 台北县| 临湘市| 鹤岗市| 南投市| 洛阳市| 合作市| 东宁县| 武冈市| 金沙县| 犍为县| 报价| 贵州省| 静乐县| 康平县| 崇明县| 金寨县| 建德市| 金寨县| 藁城市| 西和县| 郸城县| 乐至县| 亚东县| 晴隆县| 嫩江县| 巴林左旗| 珲春市| 东辽县| 嫩江县| 巍山| 晋州市| 凤庆县| 古蔺县| 上栗县| 板桥市| 来安县|