to represent the state of a class instance (i.e., to differentiate one instance of the class from another). In practice, you may often want to handle the reading or writing of properties in special ways. For example, you may want to trim a string when it is being assigned
to a `label` property. You could use the following code to achieve this task:
```php
```php
$object->label=trim($label);
$object->label=trim($label);
```
```
The drawback of the above code is that you have to call `trim()` everywhere in your code where you met set the `label`
property. If in the future, the `label` property gets a new requirement, such as the first letter must be captialized, you would again have to modify every bit of code that assigns a value to `label`. The repetition of code leads to bugs and is a practice you want to avoid as much as possible.
属性的新要求,比如首字母大写等,你就被迫必须修改所有给 `label`
属性赋值的代码。这种代码的重复会导致 bug,且这这种实践显然是你想要尽力避免的。
To solve this problem, Yii introduces a base class called [[yii\base\Object]] that supports defining properties
* These properties do not support visibility. It makes no difference for the visibility of a property
if the defining getter or setter method is public, protected or private.
* The properties can only be defined by *non-static* getters and/or setters. Static methods will not be treated in this same manner.
Returning back to the problem described at the beginning of this guide, instead of calling `trim()` everywhere a `label` value is assigned, `trim()` only needs to be invoked within the setter `setLabel()`. And if a new requirement comes that requires the label be initially capitalized, the `setLabel()` method can quickly be modified without touching any other code. The one change will universally affect every assignment to `label`.