【问题标题】:Access outer variables from anonymous class从匿名类访问外部变量
【发布时间】:2020-07-18 17:57:35
【问题描述】:

我正在尝试另一种方法:

public function index()
{
    $faker = Faker\Factory::create('fr_FR');

    $ideas = [];

    for ($i = 1; $i <= rand(10, 50); $i++) {
        $idea = new \stdClass;
        $idea->id = $i;
        $idea->author = $faker->name;
        //...

        $ideas[] = $idea;
    }
}

我不想在循环中创建对象和分配属性,而是从一个类中创建对象,并使用 array_pad() 函数填充$ideas[]

public function index()
{
    $faker = Faker\Factory::create('fr_FR');

    $ideas = [];

    $idea = new class {
        private $id;
        private $author;

        function __construct() {
            $this->id = count($ideas) + 1;
            $this->author = $faker->name;
        }
    };

    array_pad($ideas, rand(10, 50), new $idea);
        
}

所以我需要从匿名类访问$faker$ideas。我试图像这样将它们传递给班级:

$idea = new class($ideas, $faker) {

    private $id;
    private $author;

    private $ideas
    private $faker

    function __construct($ideas, $faker) {
        $this->id = count($ideas) + 1;
        $this->author = $faker->name;
    }
};

但我得到了一个

函数 class@anonymous::__construct() 的参数太少,0 已通过

【问题讨论】:

    标签: php class anonymous-class


    【解决方案1】:

    悲伤的消息:你不能为此使用array_pad

    以下是您需要应用的修复程序以消除错误:

    // array_pad($ideas, rand(10, 50), new $idea);
    array_pad($ideas, rand(10, 50), $idea); // remove new
    

    既然你已经在这里做了新的:

    $idea = new class($ideas, $faker) {
    

    即使这会填满$ideas。它将一遍又一遍地存储对您的$idea 的相同引用。这意味着如果您更改一个元素,则此更改将作用于所有元素(我想这是不需要的)。

    为了让这个工作你必须使用一个循环,它为每个条目创建一个新的$idea

    $faker = Faker\Factory::create('fr_FR');
    
    $ideas = [];
    
    for ($i = rand(10, 50); $i > 0; $i--) {
        $ideas[] = new class($ideas, $faker) {
            private $id;
            private $author;
    
            function __construct($ideas, $faker) {
                $this->id = count($ideas) + 1;
                $this->author = $faker->name;
            }
        };
    }
    

    工作example

    其他信息

    而不是这样做

    for ($i = 1; $i &lt;= rand(10, 50); $i++)

    最好这样做

    for ($i = rand(10, 50); $i &gt; 0; $i--)

    原因是每个循环都会调用比较,因此您会在每个循环上生成一个新的随机数。 Example

    这是有问题的,因为您往往会得到更多这样的低数字。例如,要获得 50 个循环,随机必须每次都返回 &gt; $i - 这是不太可能的。

    还有一件事:array_pad 返回填充的数组,所以你必须写

    $ideas = array_pad(...

    【讨论】:

    • 简洁! array_pad 和 for 循环之间有什么性能差异吗?
    • 好吧,除非它们产生相同的结果,否则您无法比较它们。一般来说,最好在适当的时候使用数组函数,因为它们是高度优化的。
    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2013-08-16
    • 2019-05-11
    相关资源
    最近更新 更多