danwe/helpers-gettersetteraccessor

辅助类,提供以最少的表达式代码定义setter和getter类方法的功能。

v1.0.1 2015-06-22 19:31 UTC

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 )

Latest Stable Version Build Status Coverage Status Download count

免责声明

此库绝不建议组合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 值。