hansel23 / strongly-typed
此包已被废弃且不再维护。作者建议使用 generic-lists 包。
小型库,鼓励在PHP中使用更严格的类型
v1.0.0
2016-05-09 11:47 UTC
Requires
- php: >=5.5
Requires (Dev)
- codeception/codeception: 2.*
- satooshi/php-coveralls: dev-master
This package is not auto-updated.
Last update: 2017-08-16 12:41:11 UTC
README
我的动机
我喜欢强类型。我认为这使代码更稳定,更容易理解。
泛型列表
我的动机
我想确保列表中有某些对象,而不仅仅是相信数组中有正确的对象。
我还想将最重要的列表函数放在一个对象中。
使用方法
您可以在运行时构建一个泛型列表的实例:new GenericList( YourOwnType::class )
推荐用法
- 创建一个新的类型,例如 YourOwnTypeList
- 从 GenericList 扩展此类型
- 重写构造函数:public function __construct() { parent::__construct( YourOwnType::class ) }
现在您可以为这个列表使用类型提示。
列表排序器
为了对列表进行排序,您必须创建一个实现 SortsLists 接口的排序器。
方法 compare( $object1, $object2 ) 的实现必须返回一个整数,如果第一个参数被认为是分别小于、等于或大于第二个参数,则返回一个小于、等于或大于零的整数。
将您的排序器实现的一个实例传递给列表的 sortBy 方法。
列表过滤器
为了过滤列表,您必须创建一个实现 FindsItems 接口并具有 isValid( $object ) 方法的过滤器。此方法必须返回一个布尔值,以指示对象是否与过滤器匹配并应返回或不返回。
将您的过滤器实现的一个实例传递给列表的 find、findLast 或 findAll 方法。 Find 和 findLast 将返回一个与您的过滤器方法匹配的对象(第一个或最后一个),而 findAll 将返回一个包含通过您的过滤器过滤的所有对象的新列表。
示例
创建列表类型
<?php
class AddressList
extends GenericList
{
public function __construct()
{
parent::__construct( Address::class );
}
}
创建排序器
<?php
class AddressSorter
implements SortsLists
{
protected $sortDirection;
/**
* @param int $sortDirection
*/
public function __construct( $sortDirection = SORT_ASC )
{
$this->sortDirection = $sortDirection;
}
/**
* @param $object1
* @param $object2
*
* @return int
*/
public function compare( $address1, $address2 )
{
/**
* @var Address $address1
* @var Address $address2
*/
if( $address1->getCity() == $address2->getCity() )
{
if( $address1->getStreet() == $address2->getStreet() )
{
return 0;
}
else
{
$result = strcmp( $address1->getStreet(), $address2->getStreet() );
}
}
else
{
$result = strcmp( $address1->getCity(), $address2->getCity() );
}
if( $this->sortDirection === SORT_DESC )
{
return - ( $result );
}
return $result;
}
}
为列表使用类型提示并使用创建的排序器进行排序
<?php
class AnnoyingHandler
{
public function sortAddresses( AddressList $addresses )
{
$addressSorter = new AddressSorter( SORT_DESC );
$addresses->sortBy( $addressSorter );
}
}
创建过滤器
<?php
class BeginningStreetNameFilter
implements FindsItems
{
private $beginningStreetName;
public function __construct( $beginningStreetName )
{
if( !is_string( $beginningStreetName ) )
{
throw new Exception( 'Street name must be a string' );
}
$this->beginningStreetName = $beginningStreetName;
}
public function isValid( $address )
{
return ( preg_match( sprintf( '!^%s!', $this->beginningStreetName ), $address->getStreet() ) );
}
}
使用过滤器
<?php
$beginningStreetNameFilter = new BeginningStreetNameFilter( 'Arlington' );
$firstAddressFound = $addresses->find( $beginningStreetNameFilter );
$lastAddressFound = $addresses->findLast( $beginningStreetNameFilter );
$foundAddresses = $addresses->findAll( $beginningStreetNameFilter );