Как правильно поступить при работе с наследованием классов?

6epkyT

Новичок
Как правильно поступить при работе с наследованием классов?

Допустим есть следующие наследование классов:
PHP:
// Error class
class Error {
	
	var $err;
	
	// constructor
	function Error($err_mess)
	{
		$this->err = $err_mess;
	}
	
	// returns error message
	function getError()
	{
		return $this->err;
	}
}

// A

class A extends Error {

	var $foo;
	
	function A($f)
	{
		if (!$f)
		{
			$this->err = 'Error in A class';
			
			// settype(&$this, 'null'); // по смыслу было бы хорошо возвращать NULL значение
			return false;
		}
		
		$this->foo = 'Created in A';
	}
	
	function getFoo()
	{
		return $this->foo;
	}
}

// -----------------------------------------------------------------------------------------
// Объект создается

$ob_a1 = new A(true);

if (!$ob_a1)
{
	echo $ob_a1->getError();
}
echo $ob_a1->getFoo();

// -----------------------------------------------------------------------------------------
// 

$ob_a2 = new A(false);

if (!$ob_a2)
{
	echo $ob_a2->getError();
}

echo $ob_a2->getFoo();
Интересует следующее:

как сделать так, чтобы

- если не выполняется какое-то условие в конструкторе класса A, то возвращался "NULL-объект"
- при этом требуется получить сообщение об ошибке, из-за которого невозможно создание экземпляра класса.

Единственное, что пока приходит в голову - ввести еще один метод в класс A, который будет определять возможно ли использовать экземпляр класса или нет.

Как вообще поступают в таких случаях?
 

robocomp

Новичок
Может, сделать статический фабричный метод, м? ну типа:
PHP:
class BlackSlave
{
  function getNewBlackSlave($params)
  {
      if (!BlackSlaveValidator::validate($params))
      {
           return new Error('shit_happend');
      }
      return new BlackSlave($params);
  }
}

$slave = BlackSlave::getNewBlackSlave('Uncle Tom From The Cabin');
if (Error::isError($slave))
{
  die();
}
Разумеется, надо понимать, что класс ерор должен иметь стат метод проверяющий, что параметр -- ошибка
P.S. Не стоит наследовать от ошибки, мне кажется. Это какая-то подстава, по-моему
 

6epkyT

Новичок
Разумеется, надо понимать, что класс ерор должен иметь стат метод проверяющий, что параметр -- ошибка
Согласен. Это уже мой промах.

Ламерский вопрос: а как проверять, что переданный параметр - это объект класса Error?
 
Сверху