hansel23/strongly-typed

此包已被废弃且不再维护。作者建议使用 generic-lists 包。

小型库,鼓励在PHP中使用更严格的类型

v1.0.0 2016-05-09 11:47 UTC

This package is not auto-updated.

Last update: 2017-08-16 12:41:11 UTC


README

Coverage Status

我的动机

我喜欢强类型。我认为这使代码更稳定,更容易理解。

泛型列表

我的动机

我想确保列表中有某些对象,而不仅仅是相信数组中有正确的对象。

我还想将最重要的列表函数放在一个对象中。

使用方法

您可以在运行时构建一个泛型列表的实例:new GenericList( YourOwnType::class )

推荐用法

  1. 创建一个新的类型,例如 YourOwnTypeList
  2. GenericList 扩展此类型
  3. 重写构造函数:public function __construct() { parent::__construct( YourOwnType::class ) }

现在您可以为这个列表使用类型提示。

列表排序器

为了对列表进行排序,您必须创建一个实现 SortsLists 接口的排序器。

方法 compare( $object1, $object2 ) 的实现必须返回一个整数,如果第一个参数被认为是分别小于、等于或大于第二个参数,则返回一个小于、等于或大于零的整数。

将您的排序器实现的一个实例传递给列表的 sortBy 方法。

列表过滤器

为了过滤列表,您必须创建一个实现 FindsItems 接口并具有 isValid( $object ) 方法的过滤器。此方法必须返回一个布尔值,以指示对象是否与过滤器匹配并应返回或不返回。

将您的过滤器实现的一个实例传递给列表的 findfindLastfindAll 方法。 FindfindLast 将返回一个与您的过滤器方法匹配的对象(第一个或最后一个),而 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 );