【问题标题】:PHP custom function with as syntax, function ($x as $y)PHP 自定义函数与 as 语法,函数 ($x as $y)
【发布时间】:2020-09-02 10:30:14
【问题描述】:

我想在匿名函数中使用 $array 作为 $element 语法来实现一个 for 循环

这可能吗?我不能使用 forEach,因为 $array 实际上是一个对象,并且 forEach 不会像使用数组那样复制对象

我正在使用 laravel,所以我正在尝试编写一个像 forEach 这样的刀片指令,但它会复制对象。

类似:

Blade::directive('safeForEach', function ($array as $el){
return '<?php for ($i = 0; $i < count($array); $i++){ ?>';
});

在调用@safeForEach 之后,我可以使用每个$el。

Blade::directive('endSafeForEach', function (){
return '<?php { ?>';
});

有什么想法吗?我试图找到刀片指令的来源,但找不到。 谢谢

【问题讨论】:

标签: php laravel foreach


【解决方案1】:

directive 命令的回调采用单个参数,该参数是在您需要解析的指令中传递的字符串。您可以查看source code of Laravel 并根据自己的需要进行调整:

Blade::directive('safeForEach', function ($expression) {
        preg_match('/\( *(.*) +as *(.*)\)$/is', $expression, $matches); 
        $iteratee = trim($matches[1]);
        $iteration = trim($matches[2]);
        $initLoop = "\$__currentLoopData = {$iteratee}; \$__env->addLoop(\$__currentLoopData);";
        $iterateLoop = '$__env->incrementLoopIndices(); $loop = $__env->getLastLoop();'.$iteration.'=clone '.$iteratee.'[$i]';

        return '<?php '. $initLoop.' for ($i = 0; $i < count('.$iteratee.'); $i++) { '.$iterateLoop.' ?>';
});
Blade::directive('endSafeForEach', function () {
        return '<?php } ?>';
});

如果你传递@safeForEach($a as $b)这个应该编译成:

$__currentLoopData = $a;
$__env->addLoop($__currentLoopData);
for ($i = 0;$i < count($a);$i++) { 
    $__env->incrementLoopIndices(); 
    $loop = $__env->getLastLoop();    
    $b = clone $a[$i];

但是你需要确保

  1. $iteratee 是可数的
  2. $i 不冲突。 Laravel 使用一个名为 $__env 的变量来存储循环信息,并假设它没有在其他地方使用,但给定的名称它不太可能被使用。
  3. clone 只会制作对象的浅表副本,并且可能会因不可克隆元素而中断,因此您可能还需要优化该部分

【讨论】:

  • 您好,感谢您的信息!我现在尝试使用该表达式来解析字符串,但也尝试包含来自 CompilesLoops 的循环逻辑。我已经包含了一个似乎有效的 use CompilesLoops 特征,但我得到了一个未定义的属性: Illuminate\View\Factory::$loop (View: /home/vagrant/machinedown/resources/views/cards/site.blade .php) 错误!
  • 添加了更接近 Laravel 源码的更新。不过,我认为不需要将其与此扩展相匹配,因此请随意调整
猜你喜欢
  • 2015-07-21
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 2014-12-03
  • 2011-12-10
  • 1970-01-01
  • 2013-09-17
相关资源
最近更新 更多