![]() |
Показаны 10 сообщений на этой странице |
Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- PHP (http://netadmin.ws/forum/forumdisplay.php?forumid=6)
-- РНР и ООП (http://netadmin.ws/forum/showthread.php?threadid=11022)
РНР и ООП
Господа, вроде не дурак, но... Сколько не читаю статей никак не могу въехать в ООП...
Ð_азъясните плз некоторые моменты:
Из мана (всё цитировать не буду см. Глава 13. Classes and Objects):
// 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();
class Named_Cart extends Cart {
var $owner;
function set_owner ($name) {
$this->owner = $name;
}
}
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();
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;
}
}
__________________
Админ - вождь Апачей...
1. Обрашение к методу класса без создания объекта. Часто бывает полезно.
2. Ð_асширение класса. Позволяет добавить функциональные возможности без изменения всего класса. Все методы и свйства родительского класса наследуются.
3. В третьем примере так как конструктор родительского класса не вызывается автоматически нужно его вызвать вручную.
4. Конструктор класса. При создании new foo('name') сразу будет вызван метод foo. Пример: класс для работы с бд - при инициализации конструктор устанавливает соеденение.
Все правильно и нет никакого маразма, начни програмить в ооп и увидешь всю разницу.
__________________
Всегда есть решение.
polo вот кроме 4. я ничего не понял, а то что автоматически он будет выз-ся я это и так понял, я не про то спрашивал...
1-3. зачем?.. В чём приимущество?..
2. "без изменения всего класса" а что трудно?.. открыть ф-л и дописать 2-3 функции?.. "свойства" - это внутренние переменные?
3. вопрос тоже не про то, а про СМЫСЛ потаённый
расширения родит. класса...
Я вроде как кодю, использую классы, функции... но кое чего ну не понимаю...
метод класса - это как я понял функция?.. Так почему её так не назвать? Зачем всё усложнять так?.. 
__________________
Админ - вождь Апачей...
потому-что в ООП есть свои термены. И никто не использует термин функция говоря о классе.
Есть такой язык Java где вообще все ООП, другого просто не существует.
__________________
Всегда есть решение.
polo ну ладно, к терминам я не придпраюсь... 
А вот про смысл мне плз разъясните, а?.. Где и почему используют всё это?..
__________________
Админ - вождь Апачей...
quote:
А вот про смысл мне плз разъясните, а?.. Где и почему используют всё это?..
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(); // одна строчка
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 () {
// инструкции
}
}
__________________
Всегда есть решение.
М... ну короткий вызов... ну ладно, допустим. Конструктор тоже ещё куда нешло, понимаю смысл...
class ArrayReloaded implements Iterator {
private $array = array();
private $valid = FALSE;
function __construct($array) {
$this->array = $array;
}
...
}
class ArrayReloaded implements Iterator {
var $array = array();
var $valid = FALSE;
...
}
$obj = new ArrayReloaded;
$obj->array = $our_array;
__________________
Админ - вождь Апачей...
не сделаешь именно потому-что приват. С введением 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.
__________________
Всегда есть решение.
Хотелось бы поднять старую тему так как на момент ее обсуждения у меня не было конкретного примера о целесообразности использования ооп.
quote:
Вообщем у меня фантазии не хватает что бы придумать где и как это можно использовать, что бы это было полезно...
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";
}
class table
{
var $width = '100%';
var $cellpadding = 0;
var $cellcapcing = 0;
// и так далее, можем добавить хоть миллион свойств и
//это никак не повлияет на работу нашего клааса в преддыдущих его использованиях
function table($array)
{
// тут выполняем требуемые нам операции,
//опять же можно менять функцию как угодно,
//главное всегда остается результат
}
}
quote:
Вообще имхо маразм какой то!.. Ð_азве вместо setName нельзя было сделать $Foo->name = 'text';???? (не я понимаю что это пример, но логика действий то должна быть?..)
__________________
Всегда есть решение.

с_такой_фигней('как','описанÐ
°','выше','я','уже','столкнулся'
, 'и', 'она', 'меня', 'попарила', 'так', 'что', 'я', 'этот', 'пример', 'хорошо', 'понял', ':',')', 'спасибо', 'за', 'разъяснение');
Оч. толково и доходчиво!
__________________
Админ - вождь Апачей...
| Формат времени GMT. Текущее время 21:18. | Показаны 10 сообщений на этой странице |
Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.