Да, в конструкторах PHP можно изменять свойства объекта. Обычно это делается для инициализации свойств при создании экземпляров классов. Разберем ваш вопрос на примере двух классов `Route` и `DotEnv`.
### Первый класс: `Route`
Вы упоминаете, что используете параметр конструктора для задания значения свойства `$methods`. Это вполне нормальный подход, который позволяет передавать значения при создании объекта:
```php
class Route {
private $methods;
public function __construct(array $methods) {
$this->methods = $methods; // Инициализация свойства
}
}
// Пример использования:
$route = new Route(['GET', 'POST']);
```
### Второй класс: `DotEnv`
Во втором классе вы присваиваете значение свойству `$path` внутри конструктора:
```php
class DotEnv {
private $path;
public function __construct($path) {
$this->path = $path; // Инициализация свойства
}
}
// Пример использования:
$dotenv = new DotEnv('/path/to/env');
```
### Ответы на ваши вопросы:
1. **Работает ли это нормально в обоих случаях?**
Да, оба подхода работают нормально. Использование параметров конструктора для инициализации свойств считается хорошей практикой.
2. **Нужно ли создавать свойство вне конструктора?**
Да, вы должны объявить свойства класса вне конструктора, чтобы они были доступны в его методах, включая конструктор. В обоих примерах вы корректно объявили свойства `$methods` и `$path` выше конструктора—это необходимо для корректной работы объектов ваших классов.
3. **Право на существование**:
Оба подхода имеют право на существование. Вы можете инициализировать свойства с помощью параметров конструктора или присваивать им значения из других источников в конструкторе. Важно, чтобы это соответствовало логике вашего приложения.
### Заключение
Выбор подхода к инициализации свойств зависит от контекста и ваших предпочтений. Главное, чтобы код оставался понятным и поддерживаемым. Оба ваших подхода являются корректными и правильными.