danwe / helpers-gettersetteraccessor
辅助类,提供以最少的表达式代码定义setter和getter类方法的功能。
v1.0.1
2015-06-22 19:31 UTC
Requires
- php: >=5.3.0
Requires (Dev)
- athletic/athletic: dev-master
- danwe/dataproviders-differenttypesvalues: 1.0.*
- phpunit/phpunit: 4.6.*
This package is not auto-updated.
Last update: 2024-09-18 08:57:42 UTC
README
辅助类,提供以最少的表达式代码定义组合的getter和setter类方法的功能。一个“组合getter和setter”的例子是 User::age( $age=null )
用于获取或设置用户的年龄,而不是使用两个单独的方法 User::getAge()
和 User::setAge( $age )
。
免责声明
此库绝不建议组合getter和setter比单独的方法更优越。可能存在某些用例,每种方法都有其特定的优缺点。选择哪种方法可能只是开发者个人风格的问题。
用法
请参阅以下用法示例
<?php use Danwe\Helpers\GetterSetterAccessor; class Options { protected $formatter; protected $name = 'Php'; protected $length; public function formatter( Formatter $value = null ) { return $this->getterSetter( __FUNCTION__ ) ->initially( function() { return new Formatter(); } ) ->getOrSet( $value ); } public function name( $value = null ) { return $this->getterSetter( __FUNCTION__ ) ->ofType( 'string' ) ->getOrSet( $value ); } public function length( $value = null ) { return $this->getterSetter( __FUNCTION__ ) ->ofType( 'int' ) ->initially( 42 ) // Equivalent to declaring "protected $length = 42" on top ->getOrSet( $value ); } protected function getterSetter( $accessProperty ) { if( !$this->getterSetter ) { $this->getterSetter = new GetterSetterAccessor( $this ); } return $this->getterSetter->property( $accessProperty ); } }
性能影响
请注意,GetterSetterAccessor
在内部使用PHP的反射功能来设置/获取属性值。
此包包含一个基准测试,用于测试使用此库的类与简单实现方法的性能。可以通过以下方式运行:
php vendor/bin/athletic -p benchmarks
示例输出
Method Name Iterations Average Time Ops/sec
------------------------------------------- ----------- ----------------- ---------
hardCodedSetterGetter : [ 6,000] [0.0000072908004] [137,159]
setterGetterUsingThisLibrary_normalUsage : [ 6,000] [0.0000241236687] [ 41,453]
setterGetterUsingThisLibrary_extensiveUsage: [ 6,000] [0.0000284811258] [ 35,110]
基准测试结果表明,使用 GetterSetterAccessor
的速度比使用硬编码方法执行相同操作慢三到四倍(这可能会因PHP版本和系统而异)。如果预计方法将被调用数千次,那么这可能会成为一个实际问题。
待办事项
- 允许为
ofType
设置多个类型。 - 通过定义触发getter的另一个值来允许设置
null
值。