webhappens / magic-properties
为任何PHP类添加简单的getter、setter、访问器和mutator接口。
Requires
- php: ^7.3|^8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.12
- phpunit/phpunit: 7.5|^8.2|^9.0
- symfony/var-dumper: ^4.3|^5.0
This package is auto-updated.
Last update: 2024-09-23 23:29:03 UTC
README
魔法属性
为任何PHP类添加简单的getter、setter、访问器和mutator接口。
安装
通过composer安装
composer require webhappens/magic-properties
将MagicProperties
特性插入到您的类中
use \WebHappens\MagicProperties\MagicProperties;
如果您的类已经使用了__call
方法,请将其添加到其中
public function __call($method, $arguments) { // ... if ($property = $this->matchMagicProperty($name)) { return $this->callMagicProperty($property, $arguments); } // ... // throw new \BadMethodCallException(); }
获取器
获取器支持"属性"和"方法"语法,并允许您获取public
和protected
属性。
$person = new class { use MagicProperties; public $name = 'Sam'; protected $role = 'developer'; }; $name = $person->name; // or $name = $person->name(); $role = $person->role; // or $role = $person->role();
如果喜欢这种语法,Getter "方法"名称可以可选地以"get"为前缀。
$person->getName();
设置器
设置器支持"属性"和"方法"语法,并允许您设置public
和protected
属性。
$person = new class { use MagicProperties; public $name; protected $role; }; $person->name = 'Sam'; // or $person->name('Sam'); $person->role = 'developer'; // or $person->role('developer');
如果喜欢这种语法,Setter "方法"名称可以可选地以"set"为前缀。
$person->setName('Sam');
只读属性
如果您想保护特定的protected
属性不被从类外设置,您可以在类中列出它们,在$readonly
数组中。
protected $readonly = ['id'];
只读属性仍然可以使用标准的php语法从类内更改。
链式设置器
当使用设置器的"方法"语法时,您可以在单个链中设置多个属性。
$person->name('Sam')->role('developer');
访问器
当从类外调用getter以获取protected
属性时,值会通过访问器方法传递,这给了您在返回之前修改它的机会。
当从类内调用时,只有当使用"方法"语法时,它才会通过访问器方法传递。
public
和private
属性永远不会通过访问器方法传递。
要为protected
属性添加访问器方法,只需创建一个遵循访问器命名约定get{PropertyName}Property
的protected
方法即可。
该方法将接收存储的值作为单个参数,并应返回修改后的值。
$person = new class { use MagicProperties; protected $role = 'developer'; protected function getRoleProperty($value) { return ucwords($value); } }; $role = $person->role; // or $role = $person->role();
在这个例子中,角色将以首字母大写的方式返回。
mutator
当从类外调用setter以设置protected
属性时,值会通过mutator方法传递,这给了您在设置之前修改它的机会。
当从类内调用时,只有当使用"方法"语法时,它才会通过mutator方法传递。
public
和private
属性永远不会通过mutator方法传递。
要为protected
属性添加mutator方法,只需创建一个遵循mutator命名约定set{PropertyName}Property
的protected
方法即可。
该方法将接收传递的值作为单个参数,并应返回修改后的值。
$person = new class { use MagicProperties; protected $role; protected function setRoleProperty($value) { return ucwords($value); } }; $person->role = 'developer'; // or $person->role('developer');
在这个例子中,角色将以首字母大写的方式存储。
序列化
调用getMagicProperties
方法将所有public
和protected
属性序列化为一个数组。
致谢
- Sam Leicester: sam@webhappens.co.uk
- Ben Gurney: ben@webhappens.co.uk
- 所有贡献者
我们的Str
类只是Laravel的Str
辅助函数的一些函数的副本。
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。