使用PHP数组类型安全,第2部分

大家好,第一部分出版以来已经过去了将近一年评论中的讨论非常热烈,我为自己得出了结论,几乎立即对lib进行了更改,但是没有时间写这本书。

最近,我通过两种方法扩展了功能,并希望与您分享此新闻。

当然,我会写有关处理错误的文章。

对于那些不知道并忘记了什么ArrayHandler的人

扰流板

让我们回答这个问题:“在PHP中使用数组进行类型安全是什么?”

类型安全为:

  • ;

  • ;

, , - . , :

$a = 0;
if (key_exists($key, $collection)) 
{
	$a = (int) $collection[$key];
}

:

$a = (int) $collection[$key] ?? 0;

, " ".

除了这三个优点外,ArrayHandler还提供了不变性,也就是说,我们可以安全地将ArrayHandler传递给抽象层,并且不会有人意外更改原始数组中的元素。为了更改该值,您需要创建一个ArrayHandler的新实例-与跳过将新值写入数组元素相比,跳过代码审阅要困难得多。

我不会复制和粘贴使用它们的示例,您可以在第一部分中看到它们也可以阅读文档

Liba是通过Composer安装的:

composer require sbwerewolf/language-specific

有PHP 5.6 / 7.0 / 7.2的版本。

到现在为止,已经有很长的介绍了。

更新

几天前,我既悲伤又无聊,我想做点好事,例如使其变得如此,以便当您使用foreach()遍历元素时,不仅可以获取元素(ValueHandler),还可以获取该元素的索引。

我满怀热情地工作了,已经编写了很多代码,我在PHP文档中遇到了一条注释,该注释使所有新代码无用。

事实证明,您可以执行以下操作:

yield $key => $value;

并且foreach()将返回元素的索引。尤里卡!

现在,IArrayHandler :: pull()返回数组元素中的新IArrayHandler以及该元素的索引。我很高兴,现在看来ArrayHandler已经成为处理数组的理想库(正如我在本文开头所指出的那样)。

. - IArrayHandler::getting(), Iterator ArrayHandler foreach() .

IArrayHandler::pulling() ArrayHandler ( , ). "pulling" - IArrayHandler::pull(), ArrayHandler .

IArrayHandler::getting() IValueHandler , . "getting" - IArrayHandler::get(), IValueHandler .

IArrayHandler::pulling() , IArrayHandler::getting() .

:

$data = new ArrayHandler(
    [
        'first' => ['A' => 1],
        'next' => ['B'=>2],
        'last' => ['C'=>3],
        4=>[5,6],
        7,
        8,
        9
    ]);

echo 'arrays'.PHP_EOL;
foreach ($data->pulling() as $key => $value) {
    echo "[$key] => class is ".get_class($value).' '.PHP_EOL;
}
echo 'values'.PHP_EOL;
foreach ($data->getting() as $key => $value) {
    echo "[$key] => {$value->asIs()} , class is ".get_class($value).' '.PHP_EOL;
}

:

arrays
[first] => class is LanguageSpecific\ArrayHandler 
[next] => class is LanguageSpecific\ArrayHandler 
[last] => class is LanguageSpecific\ArrayHandler 
[4] => class is LanguageSpecific\ArrayHandler 
values
[5] => 7 , class is LanguageSpecific\ValueHandler 
[6] => 8 , class is LanguageSpecific\ValueHandler 
[7] => 9 , class is LanguageSpecific\ValueHandler

, foreach():

$data = new ArrayHandler(
    [
        'first' => ['A' => 1],
        'next' => ['B'=>2],
        'last' => ['C'=>3],
        4=>[5,6],
        7,
        8,
        9
    ]);

echo 'ALL'.PHP_EOL;
foreach ($data as $key => $value) {
    $type = gettype($value->asIs());
    echo "[$key] => value type is $type , class is ".get_class($value).PHP_EOL;
}

:

ALL
[first] => value type is array , class is LanguageSpecific\ValueHandler
[next] => value type is array , class is LanguageSpecific\ValueHandler
[last] => value type is array , class is LanguageSpecific\ValueHandler
[4] => value type is array , class is LanguageSpecific\ValueHandler
[5] => value type is integer , class is LanguageSpecific\ValueHandler
[6] => value type is integer , class is LanguageSpecific\ValueHandler
[7] => value type is integer , class is LanguageSpecific\ValueHandler

, , , foreach(), :

foreach ($data as $key => $value) {
    /* @var \LanguageSpecific\ValueHandler $value */
    if($value->type() === 'array'){
        $handler = new ArrayHandler($value->array());
        /* some code */
    }
}

IValueHandler::default() , @GreedyIvan, , .

ArrayHandler::simplify() ,

ArrayHandler->simplify(), array_column? (c) @olegmar

C @olegmar.

IArrayHandler :: next()方法已被IArrayHandler :: pulling()取代,该方法遍历所有嵌套数组(第一个嵌套级别)。@Hett评论并非直接说服了我,而是促使我思考。

感谢@ ReDev1L在评论中的支持。

IArrayHandler :: raw()方法已添加以获得原始数组。以前,当不可能获取元素的索引时,有必要遍历原始数组,现在,根据使用经验,有必要添加/减去数组元素并从修改后的数组创建一个新的ArrayHandler。

就这样。谢谢阅读。




All Articles