 |
 |
Форум сетевых администраторов » Программирование » PHP » РНР и ООП
| Автор |
| Тема |
 |
|
 |
|
|
|
Участник+


Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: ![he][es в оф-лайне](images/offline.gif) |
Господа, вроде не дурак, но... Сколько не читаю статей никак не могу въехать в ООП...
Ð_азъясните плз некоторые моменты:
Из мана (всё цитировать не буду см. Глава 13. Classes and Objects):
PHP:
// there is no object of class A.
// this will print
// I am the original function A::example().<br />
A::example();
// create an object of class B.
$b = new B;
// this will print
// I am the redefined function B::example().<br />
// I am the original function A::example().<br />
$b->example();
В чём разница?.. "there is no object of class A" но тем не менее "this will print I am the original function A::example().<br />"...
Так какая разница если он работате?..
PHP:
class Named_Cart extends Cart {
var $owner;
function set_owner ($name) {
$this->owner = $name;
}
}
Зачем этот самый extends? не догоняю я смысла таких конструкции:
PHP:
class A {
function example() {
echo "I am A::example() and provide basic functionality.<br />\n";
}
}
class B extends A {
function example() {
echo "I am B::example() and provide additional functionality.<br />\n";
parent::example();
}
}
$b = new B;
// This will call B::example(), which will in turn call A::example().
$b->example();
Или вот пример:
PHP:
class Foo {
function Foo($name) {
// create a reference inside the global array $globalref
global $globalref;
$globalref[] = &$this;
// set name to passed value
$this->setName($name);
// and put it out
$this->echoName();
}
function echoName() {
echo "<br />", $this->name;
}
function setName($name) {
$this->name = $name;
}
}
Вообще имхо маразм какой то!.. Ð_азве вместо setName нельзя было сделать $Foo->name = 'text';???? (не я понимаю что это пример, но логика действий то должна быть?..)
Вообщем у меня фантазии не хватает что бы придумать где и как это можно использовать, что бы это было полезно...
На примерах/на пальцах плз разъясните, а?..
(только к учебникам не отсылайте, а!.. слишком путано там всё...)
__________________
Админ - вождь Апачей...
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
08-09-2005 00:44 |
|
|
Администратор
|
| 1. Обрашение к методу класса без создания объекта.... |
[сооб. #78328]
08-09-2005 15:49 |
|
Администратор


Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус:  |
1. Обрашение к методу класса без создания объекта. Часто бывает полезно.
2. Ð_асширение класса. Позволяет добавить функциональные возможности без изменения всего класса. Все методы и свйства родительского класса наследуются.
3. В третьем примере так как конструктор родительского класса не вызывается автоматически нужно его вызвать вручную.
4. Конструктор класса. При создании new foo('name') сразу будет вызван метод foo. Пример: класс для работы с бд - при инициализации конструктор устанавливает соеденение.
Все правильно и нет никакого маразма, начни програмить в ооп и увидешь всю разницу.
__________________
Всегда есть решение.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
08-09-2005 15:49 |
|
|
Участник+
|
| polo вот кроме 4. я ничего не понял, а то что... |
[сооб. #78333]
09-09-2005 00:56 |
|
Участник+


Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: ![he][es в оф-лайне](images/offline.gif) |
polo вот кроме 4. я ничего не понял, а то что автоматически он будет выз-ся я это и так понял, я не про то спрашивал...
1-3. зачем?.. В чём приимущество?..
2. "без изменения всего класса" а что трудно?.. открыть ф-л и дописать 2-3 функции?.. "свойства" - это внутренние переменные?
3. вопрос тоже не про то, а про СМЫСЛ потаённый расширения родит. класса...
Я вроде как кодю, использую классы, функции... но кое чего ну не понимаю...
метод класса - это как я понял функция?.. Так почему её так не назвать? Зачем всё усложнять так?.. 
__________________
Админ - вождь Апачей...
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
09-09-2005 00:56 |
|
|
Администратор
|
| потому-что в ООП есть свои термены. И никто... |
[сооб. #78337]
09-09-2005 07:43 |
|
Администратор


Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус:  |
потому-что в ООП есть свои термены. И никто не использует термин функция говоря о классе.
Есть такой язык Java где вообще все ООП, другого просто не существует.
__________________
Всегда есть решение.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
09-09-2005 07:43 |
|
|
Участник+
|
| polo ну ладно, к терминам я не придпраюсь...... |
[сооб. #78338]
09-09-2005 08:13 |
|
Участник+


Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: ![he][es в оф-лайне](images/offline.gif) |
polo ну ладно, к терминам я не придпраюсь... 
А вот про смысл мне плз разъясните, а?.. Где и почему используют всё это?..
__________________
Админ - вождь Апачей...
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
09-09-2005 08:13 |
|
|
Администратор
|
| [quote]А вот про смысл мне плз разъясните, а?..... |
[сооб. #78347]
09-09-2005 19:56 |
|
Администратор


Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус:  |
quote: А вот про смысл мне плз разъясните, а?.. Где и почему используют всё это?..
для краткости и простоты использования.
PHP:
class test {
function print_hello() {
$h = date('G');
if ($h > 5 AND $h < 11) {
return 'Доброе утро';
} else if ($h > 11 AND $h < 16) {
return 'Добрый день';
} else if ($h > 16 AND $h < 22) {
return 'Добрый вечер';
} else {
return 'Доброй ночи';
}
}
}
// Вызываем обычным способом
$class = new test;
echo $class->print_hello(); // две строчки
// Вызываем напрямую
echo test::print_hello(); // одна строчка
далее псомотрим на примере что ты дал немного изменив его:
PHP:
class A {
var $var1 = 'default';
var $var2 =''
function A() { // конструктор
$this->var2 = $this->var1;
}
// функция function_name
function function_name () {
// инструкции
}
}
class B extends A {
var $var1 = 'param'; // переопределяет свойство родительского класса
function B() { // так как конструктор родительского класса вызван не будет надо его вызвать вручную
parent::A(); // теперь $this->var2 == 'param'
}
/* переопределяем функцию function_name
* изменив по трбеванию какую-либо
* функциональность при этом не затрагивая
* функцию родительского класса
*/
function function_name () {
// инструкции
}
}
Отсюда хорошо видно чем удобно короткий вызов метода класса, а также зачем нужен extend. А как известно переопределить функцию без использования классов просто невозможно.
__________________
Всегда есть решение.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
09-09-2005 19:56 |
|
|
Участник+
|
| М... ну короткий вызов... ну ладно, допустим.... |
[сооб. #78348]
09-09-2005 20:16 |
|
Участник+


Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: ![he][es в оф-лайне](images/offline.gif) |
М... ну короткий вызов... ну ладно, допустим. Конструктор тоже ещё куда нешло, понимаю смысл...
PHP:
class ArrayReloaded implements Iterator {
private $array = array();
private $valid = FALSE;
function __construct($array) {
$this->array = $array;
}
...
}
Ещё один пример непонятный мне. вот делаем мы так:
$obj = new ArrayReloaded($our_array);
так?.. В классе автоматом выз-ся метод (правильно?) __construct (как стандартный, "конструктор" так?), который засовывает наш массив ($our_array) во внутреннее свойство (правильно?) array...
Т.е суть я понимаю, а целесообразность НИФИГА...
Как бы сделал я, на уровне моего понимания:
PHP:
class ArrayReloaded implements Iterator {
var $array = array();
var $valid = FALSE;
...
}
$obj = new ArrayReloaded;
$obj->array = $our_array;
Ð_азве это не проще???.. И зачем вообще свойство array делают private?..
(кроме как 1 строка - 2 строки, разница есть?)
"переопределяем функцию function_name изменив по трбеванию какую-либо функциональность при этом не затрагивая функцию родительского класса" А зачем?.. Имя сильно красивое?.. Ну сделать др. функцию и всё... не догоняю. :/
__________________
Админ - вождь Апачей...
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
09-09-2005 20:16 |
|
|
Администратор
|
| не сделаешь именно потому-что приват. С введением... |
[сооб. #78349]
09-09-2005 20:38 |
|
Администратор


Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус:  |
не сделаешь именно потому-что приват. С введением private, public... как в полноценном ООП и становится целесообразно использовать
$this->array = $array;
так как приватные объекты доступны только в классе.
$obj->array = $our_array; - не сработает
А private это все в целях безопасности, чтобы иметь полный контроль над всеми свойствами и объектами, в Java советуют вообще все свойства делать private.
polo добавил 09-09-2005 в 20:45:43:
допустим мы имеем класс:
class test {
private $var; // ожидаем целое число
function set_var ($val) {
$this->var = intval($val);
}
}
теперь мы будем уверены что программисты которые будут использовать наш класс не допустят ошибку при инициализации $var.
__________________
Всегда есть решение.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
09-09-2005 20:38 |
|
|
Администратор
|
| Хотелось бы поднять старую тему так как на... |
[сооб. #79929]
21-12-2005 00:58 |
|
Администратор


Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус:  |
Хотелось бы поднять старую тему так как на момент ее обсуждения у меня не было конкретного примера о целесообразности использования ооп.quote: Вообщем у меня фантазии не хватает что бы придумать где и как это можно использовать, что бы это было полезно...
Попытаюсь еще раз объяснить. Допустим мы создаем функцию, для примера возьмем функцию которая создает таблицу и заполняет ячейки данными:
PHP:
function table ($data, $width = '100%')
{
echo "<table width=\"$width\">\n";
// не будем усложнять пример учитывая что data может содержать массивы разных размеров,
// предположим что массив верный и нас не обманывают
$tbl_header = "<tr>\n";
$tbl_rows = '';
foreach ($data AS $header => $rows)
{
$tbl_header .= "<th>$header</th>\n";
$tbl_rows .= "<tr>\n";
for($i = 0; $i < sizeof($rows); $i++)
{
$tbl_rows .= "<td>" . $rows[$i] . "</td>\n";
}
$tbl_rows .= "</tr>\n";
}
$tbl_header .= "</tr>\n";
echo $tbl_header;
echo $tbl_rows;
echo "</table>\n";
}
Мы успешно использовали данную функцию везде где только можно в своей программе, так как функция очень нужная и наша программа без нее не имела бы права на жизнь, в один прекрасный день мы обнаружили что нашей функции нужен еще один параметр, допустим cellpadding, ну какие проблемы взяли добавили переменную в конец параметров как необязательную и горя не знаем, продолжаем ее юзать с новым параметром, потребовался еще параметр, нет проблем добавили и еще, еще набралась целая куча: cellspacing, class, height, style, background, border, все прекрасно работает, теперь мы можем нарисовать таблицу любой крутости, все параметры имеют значения по умолчанию и мы вообще можем написать table($a); и у нас будет супер таблица всего из 10 символов кода. Но вот беда, вдруг нам потребовалось создать таблицу с параметрами по умолчанию но с различным значением border, что мы делаем, вызываем функцию table($a, тупо, перебераем, все, параметры, ой, тут, еще, параметр, чуть, не, забыли, и, в, самом, конце, наконец, то, пишем, то, до, чего, мы, так, долго, стремились, $border = 5); Уф, как утомительно, но мы перебороли это в себе, смирились. Но потом начинаем понимать что это нам требуется делать все чаще и чаще, ведь человечество все время прогрессирует. Мы ищем выход из положения, и конечно же находим его в ооп. Перепишем нашу функцию объектно-ориентированной. PHP:
class table
{
var $width = '100%';
var $cellpadding = 0;
var $cellcapcing = 0;
// и так далее, можем добавить хоть миллион свойств и
//это никак не повлияет на работу нашего клааса в преддыдущих его использованиях
function table($array)
{
// тут выполняем требуемые нам операции,
//опять же можно менять функцию как угодно,
//главное всегда остается результат
}
}
Думаю после этого ни у кого не возникнет вопросов о целесообразности использования ооп. Хочу еще раз пояснить один момент, а именно:quote: Вообще имхо маразм какой то!.. Ð_азве вместо setName нельзя было сделать $Foo->name = 'text';???? (не я понимаю что это пример, но логика действий то должна быть?..)
Вернемся к нашему классу таблицы, допустим мы создаем таблицу:
$table = new table;
меняем значение cellpadding, делаем просто $table->cellpadding = 2;
В принципе нет проблем, но если учесть тот факт что можно написать и $table->cellpadding = '2"'; то в данном случае вся наша страничка пойдет по..., поэтому в ооп определяется область видимости переменных (доступно это только начиная с php5), разумно сделать переменную cellpadding приватной (в данном случае доступ к ней имел бы только наш класс) и менять ее значение функцией $table->set_cellpadding(2) в которой бы роверялся тип и/или все возможные ошибки и лишь потом задавать ее значение. На этом все, надеюсь что это поможет вам разобраться с ооп, ибо у меня раньше тоже возникало много вопросов и недоумений по этому поводу.
P.S. Если вы никогда не сталкивались с данной проблемой о которой я говорил выше, то это говорит лишь о том что либо вы всегда используете объекты, либо вы все еще очень мало программировали - поверьте моему опыту.
__________________
Всегда есть решение.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
21-12-2005 00:58 |
|
|
Участник+
|

с_такой_фигней('как','описанÐ
°','выше','я','уже','столкнулся'
,... |
[сооб. #79969]
22-12-2005 17:18 |
|
Участник+


Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: ![he][es в оф-лайне](images/offline.gif) |

с_такой_фигней('как','описанÐ
°','выше','я','уже','столкнулся'
, 'и', 'она', 'меня', 'попарила', 'так', 'что', 'я', 'этот', 'пример', 'хорошо', 'понял', ':',')', 'спасибо', 'за', 'разъяснение');
Оч. толково и доходчиво!
__________________
Админ - вождь Апачей...
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
22-12-2005 17:18 |
|
|
|
Формат времени GMT. Текущее время 00:33.
|
Правила форума:
Вы не можете создавать новые темы.
Вы не можете отвечать на существующие темы.
Вы не можете прикреплять файлы.
Вы не можете редактировать свои сообщения. |
HTML теги выкл.
Спец. код вкл.
Смайлики вкл.
[IMG] тег выкл.
|
|
|
|
| |
Page generated in 1.35941410 seconds (99.59% PHP - 0.41% MySQL) with 21 queries.
|
 |