Answer the question
In order to leave comments, you need to log in
Which of these OOP approaches is better and what are they called?
Let's say from the very beginning we have a more or less abstract class and it does something, let's say it casts magic.
class Magick
{
protected $magick;
public function doMagick()
{
echo $this->magick;
}
}
class MeguminMagick extends Magick
{
$magick = 'explosion stuff';
}
$megumin = new MaguminMagick;
$megumin = new Magick;
$megumin->setMagick('explosion stuff'); // предположим, там есть сеттер
Answer the question
In order to leave comments, you need to log in
from the very beginning we have a more or less abstract class
class User {
private $id;
private $email;
private $password;
public function __construct($email, $password)
{
// это ваш первый пример только без наследования, оно не нужно
// в нашей задаче идентификатор пораждается
// при создании объекта самим объектом, состояние по умолчанию
$this->id = Uuid::uuid4();
// мы требуем входящие данные что бы задать начальное состояние
$this->email = $email;
$this->password = $password;
}
// мутация состояния, второй вариант.
public function changePassword($password)
{
$this->password = $password;
}
}
The first method cannot be better than the second, since they are used in completely different situations.
A subclass should be created when you have additional logic called for specific cases. According to your example, if Magick is a class of any magicians, then a subclass of water magicians can define its own magick, which it can cast. Well, or form a more specific, "water" magic.
The second option implies that the magic can be completely set from the outside, and Magick only casts it, but does not participate in its "formation".
Now you have not decided for yourself what Magick is. You need to do this, and the question will disappear by itself.
It is not necessary to create heirs if they do not have additional logic. Occam's principle.
Допустим ситуацию:
- Вы создали некий модуль MyModule, в котором использовали класс MeguminMagick.
- MyModule вы опубликовали на github...
- Другие пользователи взяли MyModule в свои проекты...
В первом случае ваш MyModule не обладает возможностью настройки ибо для изменения переменной $magick нужно "влезть" в ваш код и переписать его... Это очень плохо... Ибо когда вы будете обновлять ваш MyModule возникнут конфликты...
Во втором случае - сеттер позволит настроить MyModule не изменяя его код. Что и является его гибкостью... С другой стороны для этого вам нужно будет поработать больше - дописать сеттеры, геттеры и т.д...
In short - the first way is shorter and faster and more convenient for you personally. The other one is oriented to use by other developers in their projects.
To be even more meticulous, use both the first and second methods together...
Set a value for $magick and write a setter and getter for this variable:
/**
* @var string
*/
public $magick = 'explosion stuff';
/**
* Set magick instance
*
* @return MeguminMagick
*/
public function setMagick($magick)
{
$this->magick = (string) $magick;
return $this;
}
/**
* Get magick instance
*
* @return string
*/
public function getMagick()
{
if (!is_string($this->magick)) {
throw new \InvalidArgumentException(sprintf('"%s" expects string.', __METHOD__));
};
return $this->magick;
}
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question