Вот код опытного разработчика : PHP: lass StringHelper { private $limit; public function __construct() { $this->limit = Yii::$app->params['shortTextLimit']; } public function getShort($string, $limit = null) { if ($limit === null){ $limit = $this->limit; } return substr($string, 0, $limit); } } Почему не упростить его до этого: PHP: Class StringHelper { public function getShort($string, $limit = null) { if ($limit === null){ $limit = Yii::$app->params['shortTextLimit']; } return substr($string, 0, $limit); } } Зачем связываться с методом __construct и свойством , если можно просто нужный параметр в методе getShort получить прям из параметров Yii ? Зачем так заморачиваться? Что это? Лучшие практики?
Опытный напишет: PHP: class StringHelper { private $limit; public function __construct($limit) { $this->limit = $limit; } public function getShort($string, $limit = null) { return substr($string, 0, $limit ?: $this->limit); } }
вслепую могу предположить, что это оптимизация. getShort() может вызываться несколько раз для одного объекта. незачем всякий раз дёргать длинную цепочку. логически рассуждая это свойство можно было бы статическим т.к., данный параметр общий для всего приложения, а не для конкретного объекта. это конечно копеечная оптимизация, просто она вполне логична хорошей практикой считается инъекция зависимостей, чтобы облегчить тестирование и портирование классов. то есть вот так: PHP: public function __construct($limit) { $this->limit = $limit; // <-- !!! избавились от глобальной зависимости !!! } в реальной жизни конечно, если ты делаешь код для конкретного приложения, а не для публикации на packagist, необязательно так заморачиваться.
@artoodetoo, @ElisDN писать всё всегда в конструкторе не кашерна. А если я не захочу использовать одно из св-в в этой логике... Например нашёл код приложенный в вики... по Dependency injection PHP: class DbConfiguration{ private $host; private $port; private $username; private $password; public function __construct(string $host, int $port, string $username, string $password){ // вся соль Di находится в строчках ниже $this->host = $host; $this->port = $port; $this->username = $username; $this->password = $password; } public function getHost(){ return $this->host; } // и.т.д остальные геттеры } скопировал отсюда: https://ru.wikipedia.org/wiki/Внедрение_зависимости#Пример_кода_на_PHP Конкретно данное решение инкапсулирует данные. А если я этого не хочу?)
@ElisDN я если честно вообще смысла не вижу в написании данного класса. в том виде который вы предложили - это по сути обёртка над функцией сабстр, которая не чего абсолютно не делает...
@askanim, там оба класса надо приводить, чтоб суть понять инъекции зависимости. Хотя пример слабый в вики, не показывает реальной мощи приёма. Там на Java нормальный пример
@askanim Это код из курса для новичков. Наверное, чтобы не путать новичков инъекциями зависимостей, и при этом не писать откровенно связанный код, был выбран такой вариант