Главная :: Форум :: Web ClipArt :: Поиск :: Статистика :: Топ 10 :: Публикация :: Рекомендовать
netadmin.ws
Панель управления Регистрция свободна! Календарь Список пользователей Часто задаваемые вопросы Поиск по форуму Архив скриптов Главная   
Форум сетевых администраторов
Форум сетевых администраторов Форум сетевых администраторов » Программирование » PHP » РНР и ООП
Предыдущая тема     Следующая тема
Автор
Тема    Новая тема     Ответить на эту тему
he][es
Участник+
Средний рейтинг: 4.07 | Оценок: 30
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: he][es в оф-лайне
РНР и ООП [сообщение #78321]

Господа, вроде не дурак, но... Сколько не читаю статей никак не могу въехать в ООП...
Ð_азъясните плз некоторые моменты:
Из мана (всё цитировать не буду см. Глава 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: определен

Old Post 08-09-2005 00:44
Нажмите сюда для просмотра профайла he][es Отправить Персональное сообщение he][es Найти сообщения от he][es Добавить he][es в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
[сообщение #78328]

1. Обрашение к методу класса без создания объекта. Часто бывает полезно.
2. Ð_асширение класса. Позволяет добавить функциональные возможности без изменения всего класса. Все методы и свйства родительского класса наследуются.
3. В третьем примере так как конструктор родительского класса не вызывается автоматически нужно его вызвать вручную.
4. Конструктор класса. При создании new foo('name') сразу будет вызван метод foo. Пример: класс для работы с бд - при инициализации конструктор устанавливает соеденение.

Все правильно и нет никакого маразма, начни програмить в ооп и увидешь всю разницу.

__________________
Всегда есть решение.

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 08-09-2005 15:49
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
he][es
Участник+
Средний рейтинг: 4.07 | Оценок: 30
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: he][es в оф-лайне
[сообщение #78333]

polo вот кроме 4. я ничего не понял, а то что автоматически он будет выз-ся я это и так понял, я не про то спрашивал...
1-3. зачем?.. В чём приимущество?..

2. "без изменения всего класса" а что трудно?.. открыть ф-л и дописать 2-3 функции?.. "свойства" - это внутренние переменные?

3. вопрос тоже не про то, а про СМЫСЛ потаённый расширения родит. класса...
Я вроде как кодю, использую классы, функции... но кое чего ну не понимаю...
метод класса - это как я понял функция?.. Так почему её так не назвать? Зачем всё усложнять так?..

__________________
Админ - вождь Апачей...

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 09-09-2005 00:56
Нажмите сюда для просмотра профайла he][es Отправить Персональное сообщение he][es Найти сообщения от he][es Добавить he][es в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
[сообщение #78337]

потому-что в ООП есть свои термены. И никто не использует термин функция говоря о классе.
Есть такой язык Java где вообще все ООП, другого просто не существует.

__________________
Всегда есть решение.

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 09-09-2005 07:43
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
he][es
Участник+
Средний рейтинг: 4.07 | Оценок: 30
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: he][es в оф-лайне
[сообщение #78338]

polo ну ладно, к терминам я не придпраюсь...
А вот про смысл мне плз разъясните, а?.. Где и почему используют всё это?..

__________________
Админ - вождь Апачей...

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 09-09-2005 08:13
Нажмите сюда для просмотра профайла he][es Отправить Персональное сообщение he][es Найти сообщения от he][es Добавить he][es в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
[сообщение #78347]

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: определен

Old Post 09-09-2005 19:56
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
he][es
Участник+
Средний рейтинг: 4.07 | Оценок: 30
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: he][es в оф-лайне
[сообщение #78348]

М... ну короткий вызов... ну ладно, допустим. Конструктор тоже ещё куда нешло, понимаю смысл...

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: определен

Old Post 09-09-2005 20:16
Нажмите сюда для просмотра профайла he][es Отправить Персональное сообщение he][es Найти сообщения от he][es Добавить he][es в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
[сообщение #78349]

не сделаешь именно потому-что приват. С введением 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: определен

Old Post 09-09-2005 20:38
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
[сообщение #79929]

Хотелось бы поднять старую тему так как на момент ее обсуждения у меня не было конкретного примера о целесообразности использования ооп.

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: определен

Old Post 21-12-2005 00:58
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
he][es
Участник+
Средний рейтинг: 4.07 | Оценок: 30
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: he][es в оф-лайне
[сообщение #79969]


с_такой_фигней('как','описанÐ
°','выше','я','уже','столкнулся'
, 'и', 'она', 'меня', 'попарила', 'так', 'что', 'я', 'этот', 'пример', 'хорошо', 'понял', ':',')', 'спасибо', 'за', 'разъяснение');
Оч. толково и доходчиво!

__________________
Админ - вождь Апачей...

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 22-12-2005 17:18
Нажмите сюда для просмотра профайла he][es Отправить Персональное сообщение he][es Найти сообщения от he][es Добавить he][es в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя



Формат времени GMT. Текущее время 21:19.
Новая тема   Ответить на эту тему [ Версия для печати Печать | Отправить эту страницу другу/знакомому! Отправить | Получать уведомления об обновлении этой темы Подписка ] Предыдущая тема     Следующая тема
Навигация по форуму:
Оценка темы:

Правила форума:
Вы не можете создавать новые темы.
Вы не можете отвечать на существующие темы.
Вы не можете прикреплять файлы.
Вы не можете редактировать свои сообщения.
HTML теги выкл.
Спец. код вкл.
Смайлики вкл.
[IMG] тег выкл.
 

Page generated in 1.35839510 seconds (99.61% PHP - 0.39% MySQL) with 26 queries.


  Главная :: Форум :: Web ClipArt :: Поиск :: Статистика :: Топ 10 :: Публикация :: Рекомендовать
©NetAdmin.ws, 2001-2026.
Powered by: vBulletin
Copyright ©2000, 2001, Jelsoft Enterprises Limited.