<commit_before>属性（Property）
==========

在 PHP 中，类的成员变量也被称为**属性（properties）**。它们是类定义的一部分，
用来表现一个实例的状态（也就是区分类的不同实例）。
在具体实践中，常常会想用一个稍微特殊些的方法实现属性的读写。
例如，如果有需求每次都要对 `label` 属性执行 trim 操作，
就可以用以下代码实现：

```php
$object->label = trim($label);
```

上述代码的缺点是只要修改 `label` 属性就必须再次调用 `trim()` 函数。
若将来需要用其它方式处理 `label` 属性，比如首字母大写，
就不得不修改所有给 `label` 属性赋值的代码。这种代码的重复会导致 bug，
这种实践显然需要尽可能避免。

为解决该问题，Yii 引入了一个名为 [[yii\base\Object]] 的基类，
它支持基于类内的 **getter** 和 **setter**（读取器和设定器）方法来定义属性。
如果某类需要支持这个特性，只需要继承 [[yii\base\Object]] 或其子类即可。

> 信息：几乎每个 Yii 框架的核心类都继承自 [[yii\base\Object]] 或其子类。
  这意味着只要在核心类中见到 getter 或 setter 方法，就可以像调用属性一样调用它。

getter 方法是名称以 `get` 开头的方法，而 setter 方法名以 `set` 开头。
方法名中 `get` 或 `set` 后面的部分就定义了该属性的名字。如下面代码所示，
getter 方法 `getLabel()` 和 setter 方法 `setLabel()` 操作的是 `label` 属性，：

```php
namespace app\components;

use yii\base\Object;

class Foo extend Object
{
    private $_label;

    public function getLabel()
    {
        return $this->_label;
    }

    public function setLabel($value)
    {
        $this->_label = trim($value);
    }
}
```

（详细解释：getter 和 setter 方法创建了一个名为 `label` 的属性，
在这个例子里，它指向一个私有的内部属性 `_label`。）

getter/setter 定义的属性用法与类成员变量一样。两者主要的区别是：
当这种属性被读取时，对应的 getter 方法将被调用；而当属性被赋值时，
对应的 setter 方法就调用。如：<commit_msg>Update concept-properties.md<commit_after>属性（Property）
==========

在 PHP 中，类的成员变量也被称为**属性（properties）**。它们是类定义的一部分，
用来表现一个实例的状态（也就是区分类的不同实例）。
在具体实践中，常常会想用一个稍微特殊些的方法实现属性的读写。
例如，如果有需求每次都要对 `label` 属性执行 trim 操作，
就可以用以下代码实现：

```php
$object->label = trim($label);
```

上述代码的缺点是只要修改 `label` 属性就必须再次调用 `trim()` 函数。
若将来需要用其它方式处理 `label` 属性，比如首字母大写，
就不得不修改所有给 `label` 属性赋值的代码。这种代码的重复会导致 bug，
这种实践显然需要尽可能避免。

为解决该问题，Yii 引入了一个名为 [[yii\base\Object]] 的基类，
它支持基于类内的 **getter** 和 **setter**（读取器和设定器）方法来定义属性。
如果某类需要支持这个特性，只需要继承 [[yii\base\Object]] 或其子类即可。

> 信息：几乎每个 Yii 框架的核心类都继承自 [[yii\base\Object]] 或其子类。
  这意味着只要在核心类中见到 getter 或 setter 方法，就可以像调用属性一样调用它。

getter 方法是名称以 `get` 开头的方法，而 setter 方法名以 `set` 开头。
方法名中 `get` 或 `set` 后面的部分就定义了该属性的名字。如下面代码所示，
getter 方法 `getLabel()` 和 setter 方法 `setLabel()` 操作的是 `label` 属性，：

```php
namespace app\components;

use yii\base\Object;

class Foo extends Object
{
    private $_label;

    public function getLabel()
    {
        return $this->_label;
    }

    public function setLabel($value)
    {
        $this->_label = trim($value);
    }
}
```

（详细解释：getter 和 setter 方法创建了一个名为 `label` 的属性，
在这个例子里，它指向一个私有的内部属性 `_label`。）

getter/setter 定义的属性用法与类成员变量一样。两者主要的区别是：
当这种属性被读取时，对应的 getter 方法将被调用；而当属性被赋值时，
对应的 setter 方法就调用。如：
{'fraction_non_alphanumeric': 0.1454983922829582, 'fraction_numerical': 0.0, 'mean_word_length': 5.414948453608248, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7043695', 'n_tokens_mistral': 1598, 'n_tokens_neox': 1715, 'n_words': 218}