PHP
- 5 ответов
- 0 вопросов
3
Вклад в тег
<?php
$massiv1 = ["1","13","47","48","60","67","3"];
$massiv2 = ["3","1"];
print_r(array_intersect($massiv1, $massiv2));Array
(
[0] => 1
[6] => 3
)$ composer -n config --global home
/home/<user>/.composercomposer install или composer update можно запускать с флагом --ignore-platform-reqs, чтобы проигнорировать вообще все platform-requirements. Либо можно указать игнорирование отдельных требований (возможность появилась в Composer V2). В данном случае, если задача проигнорировать только версию PHP, это будет --ignore-platform-req=php (разница с предыдущей - req, а не reqs). self, static и $this, это вопрос не только о статических/нестатических свойствах/методах, но и о Позднем статическом связывании. Поэтому ваше понимание лишь отчасти верное. Думаю, здесь нет смысла пересказывать приведенную документацию, но приведу пример, который, надеюсь, наглядно покажет некоторые различия.<?php
class A {
protected int $num;
public function __construct(int $num)
{
$this->num = $num;
}
protected function getNum(): int
{
print(__METHOD__ . PHP_EOL);
return $this->num;
}
public function getThisNum(): int
{
return $this->getNum();
}
public function getStaticNum(): int
{
return static::getNum();
}
public function getSelfNum(): int
{
return self::getNum();
}
}
class B extends A {
protected function getNum(): int {
print(__METHOD__ . PHP_EOL);
return $this->num + 5;
}
}
$b = new B(5);
print($b->getThisNum() . PHP_EOL);
print($b->getStaticNum() . PHP_EOL);
print($b->getSelfNum() . PHP_EOL);B::getNum
10
B::getNum
10
A::getNum
5getNum, определенный в классе B, будет вызван он. Если метод getNum был бы приватным, то его "версия" в B была бы не видна, и вызвался бы этот метод из A. Ниже приведу еще дополнительные примеры по поводу этого.static::getNum. В данном случае мы "принудительно" вызываем метод того класса, экземпляром которого мы сейчас являемся, то есть B. Если бы метод getNum был приватным, здесь была бы ошибка, поскольку пытаемся дернуть метод, недоступный нам по области видимости.self::getNum. В данном случае мы вызываем метод именно того класса, в котором находимся, то есть A, несмотря на то, что работаем по факту с экземпляром B.<?php
class A {
private $num = 1;
}
class B extends A {
private $num = 2;
}
$closure = function() {
return $this->num;
};
$closureAA = $closure->bindTo(new A(), 'A');
$closureAB = $closure->bindTo(new A(), 'B');
$closureBA = $closure->bindTo(new B(), 'A');
$closureBB = $closure->bindTo(new B(), 'B');
print($closureAA() . PHP_EOL);
// будет ошибка, поскольку из B пытаемся получить приватное поле A
// print($closureAB() . PHP_EOL);
print($closureBA() . PHP_EOL);
print($closureBB() . PHP_EOL);1
1
2 boot() в моделях (как и многое другое) - это уличная магия Laravel'а, от которой вообще лучше избавляться в долгоживущих проектах и никогда больше не вспоминать. parent::boot() из своей модели, вся эта логика не отработает.