Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP, ООП, наследование) Как поступают в таких случаях? / 9 сообщений из 9, страница 1 из 1
28.06.2005, 17:01
    #33138867
Berkut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP, ООП, наследование) Как поступают в таких случаях?
Допустим есть следующие наследование классов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
// 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, который будет определять возможно ли использовать экземпляр класса или нет.

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

P.S. Сразу извиняюсь за коряво поставленный вопрос, потому что сам пока не знаю как точнее и понятнее описать проблему. Если что, задавайте вопросы. :)
...
Рейтинг: 0 / 0
28.06.2005, 17:51
    #33139011
.-.-.-.-.-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP, ООП, наследование) Как поступают в таких случаях?
наследовать сущность от класса Error это все равно что наследовать ее от класса DB - неправильно.
Что можно наследовать от класса Error - другие ошибки. Примером может быть дерево исключений в любом языке (например python http://www.python.org/doc/current/lib/module-exceptions.html)

Объекта Null - не существует - есть значение null.
Хотя можно создать самому такой класс.

> - если не выполняется какое-то условие в конструкторе класса A, то возвращался "NULL-объект"

создавать объект не через конструктор а через статический метод (паттерн factory и ему подобные)
$db = DB::createConnection();

Что касается получения текста ошибки можно придумать разные способы:
1. возвращать объект типа Error. (см pear)
2. создать в классе поле error и в случае ошибки писать в него текст :
$db = new DB();
if ($db->error) {
die($db->error);
}
...
Рейтинг: 0 / 0
28.06.2005, 18:18
    #33139062
Berkut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP, ООП, наследование) Как поступают в таких случаях?
.-.-.-.-.-наследовать сущность от класса Error это все равно что наследовать ее от класса DB - неправильно.
С замечанием полностью согласен.

Просто хотелось сделать один интерфейс для получения и обработки ошибок.

Может быть Вы тогда посоветуете в каком направлении двигаться. В ООП-программировании на PHP я пока что не силен и это мой первый опыт :).

.-.-.-.-.-Объекта Null - не существует - есть значение null.Если вы заметили, то там были кавычки " ("NULL-объект").

.-.-.-.-.-Что касается получения текста ошибки можно придумать разные способы:
1. возвращать объект типа Error. (см pear)
2. создать в классе поле error и в случае ошибки писать в него текст :
$db = new DB();
if ($db->error) {
die($db->error);
}
А как в себя в таком случае поведут наследуемые классы?
Не будет ли перекрытия имен и т.д.?
...
Рейтинг: 0 / 0
28.06.2005, 19:07
    #33139118
.-.-.-.-.-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP, ООП, наследование) Как поступают в таких случаях?
В большинстве случаев агрегацию следует предпочесть наследованию.
Наследуемые классы поведут себя так, как ты напишешь. Если получиться наложение, то это будет твоя ошибка. Под ПХП5 можно использовать private-свойства, тогда такие наложения можно будет легче отслеживать.

Посоветовать в обучении ничего не могу (разве что почитать похожие обсуждения на phpclub - там таких вопросов было много)
...
Рейтинг: 0 / 0
28.06.2005, 19:48
    #33139161
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP, ООП, наследование) Как поступают в таких случаях?
Может быть Вы тогда посоветуете в каком направлении двигаться.
если хотите ООП то следует двигаться в сторону тех языков (или их версий) которые позволяют это делать, а не извращаться там где это скорее всего совершенно не нужно.

ЗЫ
ох могут побить за подобные заявления тута ;-))
...
Рейтинг: 0 / 0
29.06.2005, 10:58
    #33139758
JackS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP, ООП, наследование) Как поступают в таких случаях?
vfabr Может быть Вы тогда посоветуете в каком направлении двигаться.
если хотите ООП то следует двигаться в сторону тех языков (или их версий) которые позволяют это делать, а не извращаться там где это скорее всего совершенно не нужно.

ЗЫ
ох могут побить за подобные заявления тута ;-))

уже достаю ремень %)
...
Рейтинг: 0 / 0
29.06.2005, 11:56
    #33139983
.-.-.-.-.-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP, ООП, наследование) Как поступают в таких случаях?
vfabr Может быть Вы тогда посоветуете в каком направлении двигаться.
если хотите ООП то следует двигаться в сторону тех языков (или их версий) которые позволяют это делать, а не извращаться там где это скорее всего совершенно не нужно.

ЗЫ
ох могут побить за подобные заявления тута ;-))
в ПХП5 вполне нормальные возможности для ООП
...
Рейтинг: 0 / 0
29.06.2005, 12:13
    #33140043
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP, ООП, наследование) Как поступают в таких случаях?
для тех кто в танке повторяю

языков (или их версий)

;-)
...
Рейтинг: 0 / 0
02.07.2005, 16:41
    #33146413
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP, ООП, наследование) Как поступают в таких случаях?
Попробуй исключительную ситуацию в конструкторе
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP, ООП, наследование) Как поступают в таких случаях? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]