Задать вопрос
  • Как убрать зависимость от версии в composer?

    Amega
    @Amega
    Senior PHP Developer
    Зависимость, скорее всего, вряд ли прописана глобально. Но расположение глобального конфига, откуда это требование можно убрать/настроить, можно посмотреть командой:
    $ composer -n config --global home                
    /home/<user>/.composer


    Если же нужно все равно накатить проект, игнорируя подобные требования, composer install или composer update можно запускать с флагом --ignore-platform-reqs, чтобы проигнорировать вообще все platform-requirements. Либо можно указать игнорирование отдельных требований (возможность появилась в Composer V2). В данном случае, если задача проигнорировать только версию PHP, это будет --ignore-platform-req=php (разница с предыдущей - req, а не reqs).
    Ответ написан
    Комментировать
  • Правильно ли я понимаю смысл статических и не статических объектов (this self)?

    Amega
    @Amega
    Senior PHP Developer
    Говоря о 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
    5


    Поясню вкратце. Метод `getNum` определен в базовом классе A, но переопределено в классе B. При этом мы дальше создаем экземпляр класса B и работаем уже "через" него. Но все используемые нами методы определены только в классе A и унаследованы в B. Происходит тут примерно следующее:

    1. $this - это ссылка на текущий объект (экземпляр класса B), но в области видимости A. Это тоже не самая тривиальная связка для понимания. Но суть в том, что поскольку нам отсюда виден метод getNum, определенный в классе B, будет вызван он. Если метод getNum был бы приватным, то его "версия" в B была бы не видна, и вызвался бы этот метод из A. Ниже приведу еще дополнительные примеры по поводу этого.


    2. Вызывается static::getNum. В данном случае мы "принудительно" вызываем метод того класса, экземпляром которого мы сейчас являемся, то есть B. Если бы метод getNum был приватным, здесь была бы ошибка, поскольку пытаемся дернуть метод, недоступный нам по области видимости.


    3. Вызывается self::getNum. В данном случае мы вызываем метод именно того класса, в котором находимся, то есть A, несмотря на то, что работаем по факту с экземпляром B.



    Говоря об областях видимости, полезно будет также разобраться с замыканиями (Closure), а еще лучше - непосредственно поиграться с ними. Или если быть точнее, с привязкой их (bind) к разным объектам.

    Для примера можно взглянуть на этот код
    <?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
    Ответ написан
    Комментировать
  • Две версии php на одном сайте без домена на одном ip на одном порту в разных папках?

    Amega
    @Amega
    Senior PHP Developer
    "Два сервера" на одном порту по определению висеть не могут: порт занимается кем-то одним. А вот уже внутри этого сервера вы можете настроить "маршрутизацию" - какие запросы как обрабатывать. То есть одни запросы направить на 7й пых, другие - на 8й. Но конкретную конфигурацию Apache сейчас не скажу, сто лет им не пользовался.
    Ответ написан
    Комментировать
  • Как найти совпадения по числам среди двух массивов php?

    Amega
    @Amega
    Senior PHP Developer
    Ну вообще array_intersect() как раз это и делает - возвращает пересечение массивов. И в данном случае он работает.

    <?php
    
    $massiv1 = ["1","13","47","48","60","67","3"];
    $massiv2 = ["3","1"];
    
    print_r(array_intersect($massiv1, $massiv2));

    Array
    (
        [0] => 1
        [6] => 3
    )

    Если смущают ключи в результирующем массиве (они соотв-ют дубликатам, но в первом указанном массиве), их можно убрать, дополнительно обернув результирующий массив в array_values()
    Ответ написан
    Комментировать
  • Что значит parent::boot() в модели?

    Amega
    @Amega
    Senior PHP Developer
    boot() в моделях (как и многое другое) - это уличная магия Laravel'а, от которой вообще лучше избавляться в долгоживущих проектах и никогда больше не вспоминать.

    Но ответ простой: в базовом классе Model есть тоже своя логика, которая должна выполнится. По большому счету даже не важно, что там именно происходит, ее просто стоит выполнить. Но в целом там бутятся еще и все используемые в модели трейты:

    https://github.com/illuminate/database/blob/master...

    Соотв-но, убрав parent::boot() из своей модели, вся эта логика не отработает.
    Ответ написан
    Комментировать
  • Чем заслужил свою популярность Laravel?

    Amega
    @Amega
    Senior PHP Developer
    Могу смело рекомендовать работать на Laravel. Сам на нем запустил три сайта за последнее время, а на освоение его у меня ушел всего один день, настолько он прост и в тоже время мощен. Соответствует моим представлениям о том, каким должен быть настоящий фреймворк.
    Очень много чего идет из коробки, при этом является опциональным, то есть отключаемым. Если говорить о внутренностях, то там все просто идеально: использованы современные паттерны проектирования, комменты повсюду. Практически любой компонент фреймворка является заменяемым, то есть можно переделать все под себя, не меняя сам код фреймворка.
    Имеется огромное множество готовых пакетов для реализации самых разных задач. Например, чтобы прикрутить капчу к своему сайту, у меня ушло порядка 10 минут. Аналогично для поддержки BBCodes.
    У фреймворка довольно исчерпывающая документация на официальном сайте, учился чисто по ней.
    Ответ написан
    3 комментария