从匿名 class 访问外部变量
Access outer variables from anonymous class
我正在尝试另一种方法:
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;
}
}
我不想在循环中创建对象和分配属性,而是想从 class 创建对象,并使用 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);
}
所以我需要从匿名 class 访问 $faker
和 $ideas
。我试图像这样将它们传递给 class :
$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;
}
};
但我得到一个
Too few arguments to function class@anonymous::__construct(), 0 passed
不幸的消息:您不能为此使用 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 <= rand(10, 50); $i++)
最好这样做
for ($i = rand(10, 50); $i > 0; $i--)
原因是每次循环都会调用比较,因此您会在每次循环中生成一个新的随机数。 Example
这是有问题的,因为您往往会得到更多像这样的低数字。例如,要获得 50 个循环,随机数每次都必须 return > $i
- 这是不太可能的。
还有一件事:array_pad return是填充的数组,所以你必须写
$ideas = array_pad(...
我正在尝试另一种方法:
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;
}
}
我不想在循环中创建对象和分配属性,而是想从 class 创建对象,并使用 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);
}
所以我需要从匿名 class 访问 $faker
和 $ideas
。我试图像这样将它们传递给 class :
$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;
}
};
但我得到一个
Too few arguments to function class@anonymous::__construct(), 0 passed
不幸的消息:您不能为此使用 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 <= rand(10, 50); $i++)
最好这样做
for ($i = rand(10, 50); $i > 0; $i--)
原因是每次循环都会调用比较,因此您会在每次循环中生成一个新的随机数。 Example
这是有问题的,因为您往往会得到更多像这样的低数字。例如,要获得 50 个循环,随机数每次都必须 return > $i
- 这是不太可能的。
还有一件事:array_pad return是填充的数组,所以你必须写
$ideas = array_pad(...