[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вопросы по классам
KaFe
Назвал тему так, потому что знаю, что буду задавать м вопросы по ООП. И чтобы не создавать новые топики буду все спрашивать тут.

И так вот мой первый вопрос: у меня есть класс, точнее пишу класс, а точнее писал, пока не наткнулся на такую проблему, вот текста класса.

class folder extends Controller
{
public $folder;
function get_folder()
{
$el = scandir ($this->folder);
foreach ($el as $key => $value)
if ($value == '.' || $value == '..' ||
!
is_dir($this->folder.'/'.$el[$key])) unset($el[$key]);
return $el;
}
}

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

$a = new folder;
$a->folder='babamanya';
$a->get_folder();


чтобы в классе делалось вот так
$this->folder = MDIR.'/'.$this->folder;


Я склоняюсь к варианту с использованием магического метода __set

Посоветуйте что-нибудь.



Спустя 26 минут, 4 секунды (22.07.2010 - 19:40) igor717 написал(а):
Может я конечно и не прав, тк тоже относительно недавно сел плотно зо ООП.

Но проще переменную сразу передать в функцию
$
a->get_folder('babamanya');

А константа MDIR она и в функциях и в классах должна быть доступна

$el = scandir (MDIR . '/' . $this->folder);


Ну или где она там тебе нужна

Спустя 36 минут, 59 секунд (22.07.2010 - 20:17) KaFe написал(а):
igor717
Я это знаю, но мне нужно именно так как я написал

Вариант с магическим методом
class folder extends Controller
{
function get_folder()
{
$el = scandir ($this->folder);
foreach ($el as $key => $value)
if ($value == '.' || $value == '..' ||
!
is_dir($this->folder.'/'.$el[$key])) unset($el[$key]);
return $el;
}
function __set($var,$value)
{
if ($var == 'folder') $this->folder = MDIR.$value;
}
}

Он работает на ура, но правильно ли это??

Спустя 16 минут, 50 секунд (22.07.2010 - 20:34) igor717 написал(а):
KaFe, а оно у тебя работает?

Я просто как-то пробовал применить __set но оно у меня работало только в паре с __get. Это класс целеком?

Спустя 14 минут, 23 секунды (22.07.2010 - 20:48) KaFe написал(а):
igor717 все пашет, я не знаю как ты проверял, у меня работает на двух сервах, на них php 5.2, я даже на хостинге проверил

Спустя 13 минут, 39 секунд (22.07.2010 - 21:02) igor717 написал(а):
KaFe, я вот лично вообще понять не могу зачем применять метод __set __get (может ты мне объяснишь). Просто, как мне кажется, даже в твоем случаи гораздо проще вызвать функцию и передать в нее переменную... Ну это как минимум меньше кода.

Я конечно может и не прав, поэтому и хотелось узнать зачем они вообще нужны

Спустя 15 минут, 19 секунд (22.07.2010 - 21:17) KaFe написал(а):
igor717 А если мне надо потом будет изменить папку с которой я работаю я опять полезу вызывать get_folder('путь'); я просто задам свойство $a->folder, а класс уже будет с ним работать. У меня же все таки будет не один метод.

Да и вообще мне кажется не эстетично вызывать новый метод для того чтобы изменить свойство. В делпфи не делают так
textbox1.text('Тут тукст') 
а делают так
textbox1.text := 'тут текст'

Спустя 15 минут, 43 секунды (22.07.2010 - 21:33) igor717 написал(а):
KaFe, тебе же так или иначе придется поменять название папки или в вызове определенной функции или указав значение переменной.

А так как у тебя она инициализируется мне кажется вообще неправильно, так как функция __set теряет смысл. Она ведь вроде как при вызове переменной, которой не существует в классе, присваивает значение какой-нибудь подготовленной для этого переменной в классе. А у тебя четко заданы рамки
if ($var == 'folder') 
Это считай то же самое, что ты писал в начале
$a->folder='babamanya';


Спустя 10 минут, 51 секунда (22.07.2010 - 21:44) KaFe написал(а):
igor717 если тебя так задевает не правильное назначение __set, то вот

class folder extends Controller
{
protected $dir;
function get_folder()
{
$el = scandir ($this->dir);
foreach ($el as $key => $value)
if ($value == '.' || $value == '..' ||
!
is_dir($this->dir.'/'.$el[$key])) unset($el[$key]);
return $el;
}
function __set($var,$value)
{
if ($var == 'folder') $this->dir = MDIR.$value;
}
}

Но результат один и тот же

Спустя 15 минут, 23 секунды (22.07.2010 - 21:59) igor717 написал(а):
Ладно, впринцепе все это ерунда, но тогда уже лучше сделать так:

class folder extends Controller
{
protected $dir;

function get_folder() {

$el = scandir ($this->dir);

foreach ($el as $key => $value)
if ($value == '.' || $value == '..' ||
!
is_dir($this->dir.'/'.$el[$key])) unset($el[$key]);

return $el;
}

function __set($var,$value) {
$this->dir = MDIR.$value;
}
}


Тогда ты по идеи сможешь любое имя переменной прописать, которой нет в классе или которая является закрытой, и она присвоит значение переменной $this->dir, Но какой-то выгоды от этого, я лично вообще не вижу...

Спустя 20 минут, 32 секунды (22.07.2010 - 22:20) KaFe написал(а):
igor717 я чувствовал что с вами беседа проста бесполезна, так как в концов вы выдали не работающий как надо листинг кода. biggrin.gif

Спустя 8 минут, 22 секунды (22.07.2010 - 22:28) igor717 написал(а):
KaFe, не знаю у кого он не рабочий, у меня все отлично работает:

define('MDIR', 'так что не знаю с кем из нас беседа бесполезно, ');

class folder
{
protected $dir;

function get_folder() {
echo $this->dir;
}

function __set($var,$value) {
$this->dir = MDIR.$value;
}
}


$a = new folder;
$a->chush = 'KaFe';
$a->get_folder();


Можете протестировать...

Спустя 20 минут, 41 секунда (22.07.2010 - 22:49) KaFe написал(а):
igor717 читайте пля код с первого поста а не теоритическим **биществом
занимайтесь, у меня должен выполнять конкретные действия а не совать нафиг варнинги по каждое не не заданное свойство

Спустя 9 минут, 58 секунд (22.07.2010 - 22:59) igor717 написал(а):
Я вам просто привел способ реализации функции __set, ее значение отлично передается, дальше что будет происходить в Вашей функции я ничего не менял (не считая последнего поста), я просто отредактировал Ваш код, который из-за табуляций смотрится криво и понять его было вообще сложно и если я что-то удалил случайно, что функция перестала работать, то уж извините, могли бы просто поправить, а не переходить на оскорбления...

А вообще почитайте мануал, там четко сказано для чего нужна функция __set - Вы ее используете не по назначению. И потому я спрашивал зачем Вы ее вообще в свой код впихнули.

Спустя 16 минут, 14 секунд (22.07.2010 - 23:15) KaFe написал(а):
Цитата (igor717 @ 22.07.2010 - 19:59)
Я вам просто привел способ реализации функции __set

Я просил это?
Цитата (igor717 @ 22.07.2010 - 19:59)
ее значение отлично передается

А кто говорил что тут была проблема?
Цитата (igor717 @ 22.07.2010 - 19:59)
я просто отредактировал Ваш код, который из-за табуляций смотрится криво и понять его было вообще сложно и если я что-то удалил случайно

Ну давайте оправдываться что у меня стиль пля не такой как у вас , корявый нафиг и все такое.
Цитата (igor717 @ 22.07.2010 - 19:59)
функция перестала работать, то уж извините, могли бы просто поправить, а не переходить на оскорбления...

Это была в точности моя функция если бы я переправил

Цитата (igor717 @ 22.07.2010 - 19:59)
А вообще почитайте мануал, там четко сказано для чего нужна функция __set

Вы что думаете знаете больше меня или думаете, что я полный нуб и нефига не понимаю?

Цитата (igor717 @ 22.07.2010 - 19:59)
И потому я спрашивал зачем Вы ее вообще в свой код впихнули.

по моему,Я вам ответил в предыдущих постах

Я просил совета как можно сделать по другому, а не просьбы и обсуждений почему я сделал именно так

Спустя 9 часов, 33 минуты, 4 секунды (23.07.2010 - 08:48) linker написал(а):
class folder extends Controller
{
public $folder;
public function __construct($folder)
{
$this->folder = MDIR . '/' . $folder;
}
public function get_folders()
{
$el = scandir ($this->folder);
foreach ($el as $key => $value)
if ($value == '.' || $value == '..' || !is_dir($this->folder.'/'.$el[$key]))
unset($el[$key]);
return $el;
}
}

$folder = new folder('blablabla');
$folder->get_folders();

Спустя 1 час, 19 минут, 41 секунда (23.07.2010 - 10:08) KaFe написал(а):
linker а если мне нужно сменить папку с которой я работаю, то как мне быть??? blink.gif

Спустя 5 минут, 36 секунд (23.07.2010 - 10:13) linker написал(а):
class folder extends Controller
{
public $folder;
public function __construct($folder)
{
$this->set_folder($folder);
}
public function set_folder($folder)
{
$this->folder = MDIR . '/' . $folder;
}
public function get_folders()
{
$el = scandir($this->folder);
foreach ($el as $key => $value)
if ($value == '.' || $value == '..' || !is_dir($this->folder . '/' . $el[$key]))
unset($el[$key]);
return $el;
}
}

$folder = new folder('blablabla');
$folder->get_folders();
$folder->set_folder('dadada');
$folder->get_folders();

Спустя 32 секунды (23.07.2010 - 10:14) igor717 написал(а):
KaFe, eсли я все же тебя правильно понял, то тебе нужно вначале установить так сказать настройки, что бы при последующей работе с классом можно было ими пользоваться, так вот функция __set вообще не для этого и тебе ничем не поможет.

Я в этом случаи использую Паттерн Singleton. Смысл его в том, что при первом обращении к классу ты задаешь настройки и создается его копия и при всех последующих к нему обращениях ты пользуешься его копией. Надеюсь понятно написал. Я тут по быстрому накидал его примерчик - протестируй и все поймешь... Ну а свою под свою функцию уже сам подделывай.

class W {

private static $instance = NULL;
private $cush = 'abc';

private function __construct($var) {
echo ' -1- ';
$this->chush = $var;
}

static public function getInstance($var = null) {
if(self::$instance == NULL){
self::$instance = new W($var);
return self::$instance;
} else {
return self::$instance;
}
}


public function act() {
echo $this->chush;
}

public function __destruct () {
echo ' -5- ';
}
}


class X {

public function action() {
W::getInstance()->act();
echo ' -3- ';
}

}

$var = ' -2- ';
W::getInstance($var);

$b = new X;
$b->action();

$c = new X;
$c->action();




Спустя 6 минут, 43 секунды (23.07.2010 - 10:20) KaFe написал(а):
igor717 а мне это зачем ? blink.gif

Спустя 2 минуты, 25 секунд (23.07.2010 - 10:23) igor717 написал(а):
KaFe, ясно хочу то не знаю что, тогда варианта один передавай каждый раз новые значения

Спустя 12 минут, 5 секунд (23.07.2010 - 10:35) KaFe написал(а):
igor717 спрошу только одно, ты понимаешь смысл моего скрипта, как он работает, ты запускал его???

Спустя 5 минут, 44 секунды (23.07.2010 - 10:41) linker написал(а):
Можно расширить функционал
class folder extends Controller
{
public $folder;
public function __construct($folder)
{
$this->set_folder($folder);
}
public function set_folder($folder)
{
$this->folder = MDIR . '/' . $folder;
}
public function get_folders($folder = '')
{
if (!empty($folder)) $this->set_folder($folder);
$el = scandir($this->folder);
foreach ($el as $key => $value)
if ($value == '.' || $value == '..' || !is_dir($this->folder . '/' . $el[$key]))
unset($el[$key]);
return $el;
}
}

$folder = new folder('blablabla');
$folder->get_folders();
$folder->set_folder('dadada');
$folder->get_folders();
$folder->get_folders('nonono');

Спустя 6 минут, 59 секунд (23.07.2010 - 10:48) KaFe написал(а):
linker такой метод уже обсуждался в предыдущих постах, он не подошел из за своей не эстетичности wink.gif

нужно что было вот так
$a->folder = 'kernel';

Спустя 12 секунд (23.07.2010 - 10:48) igor717 написал(а):
Для того чтобы понять как она работает ее не нужно запускать.

Я подобную функцию использую для сканирования директории с модулями у меня он используется только для этого. Просто я лично уже совсем запутался что тебе нужно в итоге.
У тебя изначально был готовый ее вариант, а ты полез в __set, вот и все.

Спустя 2 минуты, 39 секунд (23.07.2010 - 10:51) linker написал(а):
Я что-то упустил, в чем проявляется неэстетичность?
вот так
$a->folder = 'kernel';
дурной тон в ООП.

Спустя 40 секунд (23.07.2010 - 10:51) Michael написал(а):
KaFe, отвечу тебе именно на твой вопрос rolleyes.gif .
Задумка ясна, но с __set не получится. Он вызовется только первый раз, когда свойство не определено в объекте, а при следующих присвоениях вызываться не будет.
Решение - выше от linker-а.

Спустя 1 минута, 3 секунды (23.07.2010 - 10:52) KaFe написал(а):
Michael а ты проверял??? У меня такое ощущение, что здесь тусуются одни теоретики..... У меня все работает с вариантом __set

Цитата
дурной тон в ООП.

Где написано???? Статью

Спустя 1 минута, 41 секунда (23.07.2010 - 10:54) glock18 написал(а):
KaFe
пока устное предупреждение. igor717 пытался тебе помочь, а первым кто здесь написал глупость, был ты, когда припахал сюда совершенно безосновательно __set.

суть вопроса вообще не ясна. то ли ты хочешь другие решения увидеть (последний пост linker здесь самый раз), то ли преследуешь какие-то другие цели - непонятно.

Спустя 1 минута, 31 секунда (23.07.2010 - 10:55) glock18 написал(а):
Цитата (KaFe @ 23.07.2010 - 07:48)
из за своей не эстетичности


поверь, такой адский листинг медота __set, как из примеров с php.net, ничуть не более эстетичен. Использование сеттеров и геттеров для доступа свойств является самым что ни на есть эстетичным стандартом.

Спустя 4 минуты, 16 секунд (23.07.2010 - 11:00) linker написал(а):
KaFe
Читай Бьерна Страуструпа

Спустя 1 минута, 1 секунда (23.07.2010 - 11:01) Michael написал(а):
Цитата (KaFe @ 23.07.2010 - 09:52)
Michael а ты проверял??? У меня такое ощущение, что здесь тусуются одни теоретики..... У меня все работает с вариантом __set

Ага, теперь заметил как ты выкрутился. Хитрец.


Спустя 2 минуты (23.07.2010 - 11:03) linker написал(а):
Вот это
function __set($var,$value)
{
if ($var == 'folder') $this->dir = MDIR.$value;
}
бред и неправильно, хоть и рабочее. Имхо, правильное применение __set и __get с динамическими полями класса
class A
{
protected $Properties = array();
public function __set($PropertyName, $PropertyValue)
{
$this->Properties[$PropertyName] = $PropertyValue;
}
public function __get($PropertyName)
{
if (!isset($this->Properties[$PropertyName])) return null;
return $this->Properties[$PropertyName];
}
}

Спустя 23 секунды (23.07.2010 - 11:03) KaFe написал(а):
glock18 мне пофиг эстетичен ли метод __set, мне сказали что это
Цитата (linker @ 23.07.2010 - 07:51)
$a->folder = 'kernel';
не эстетичен

linker кукую книгу?? Название.


Да и еще по поводу __set, я привел вариант, и просил совета как можно сделать по другому.

mad.gif

Спустя 54 секунды (23.07.2010 - 11:04) KaFe написал(а):
Я знаю что это пахнет бредом, НО как сделать по другому wink.gif

Спустя 2 минуты, 40 секунд (23.07.2010 - 11:07) linker написал(а):
Цитата (KaFe @ 23.07.2010 - 08:04)
Я знаю что это пахнет бредом, НО как сделать по другому wink.gif

Я тебе написал как правильно и эстетично.

Бьерн Страуструп. Язык программирования С++

Спустя 2 минуты, 39 секунд (23.07.2010 - 11:09) KaFe написал(а):
linker страница или глава.

Спустя 1 минута, 3 секунды (23.07.2010 - 11:10) linker написал(а):
KaFe
Вся книга целиком, от корки до корки. Короче, тебе нарисовали как нужно, хочешь пользуйся, не хочешь не пользуйся.

Спустя 15 минут, 40 секунд (23.07.2010 - 11:26) KaFe написал(а):
Короче буду думать сам ведь тут бесполезно что-то выяснять smile.gif

Спустя 25 минут, 36 секунд (23.07.2010 - 11:52) linker написал(а):
А чего тут думать?

Спустя 14 минут, 2 секунды (23.07.2010 - 12:06) KaFe написал(а):
linker ну вот так я примерно надумал
class folder extends Controller
{
protected $property =array();

public function get_element()
{
if (is_dir($this->property['folder']))
{
$el = scandir ($this->property['folder']);
foreach ($el as $key => $value)
if ($value != '.' && $value != '..')
{
if (is_dir($this->property['folder'].'/'.$el[$key])) $dir[] = $el[$key];
else $file[] = $el[$key];
$array[] = $el[$key];
}
if ($this->property['type'] == 'dir') return $dir;
if ($this->property['type'] == 'file') return $file;
}
return $array;
}

function __set($var,$value)
{
if ($var == 'folder') $this->property[$var] = MDIR.$value;
else $this->property[$var] = $value;
}
}

Добавил type для получение dir - папок, file - файлов ну и получение всех элементов папки

Спустя 1 минута, 57 секунд (23.07.2010 - 12:08) twin написал(а):
linker
Цитата
А чего тут думать?

Как что... Нужно же запутать все, очевидное не тру.

Все же очень прав Стерлинг Хьюз
Цитата
...всё ООП состоит из превращения уже имеющихся задач в новые. И уже только потом дело доходит до их решения.
biggrin.gif

Спустя 42 минуты, 46 секунд (23.07.2010 - 12:50) linker написал(а):
KaFe
Пойдем по порядку.
1. Поля класса известны и жестко определены? Да. Это:
folder - текущая рабочая папка
list - список папок/файлов
2. Т.к. поля жестко заданы, то есть ли необходимость использования __set? Нет. Значит при проектировании класса это учитываем.
На коленке получилось
class folder extends Controller
{
const TYPEALL = -1;
const TYPEDIRS = 0;
const TYPEFILES = 1;
protected $folder = MDIR;
protected $list = array();

protected function readFolder()
{
$this->list = array();
$items = scandir ($this->folder);
foreach ($items as $key => $value)
{
if ($value == '.' || $value == '..') { continue; }
if (is_dir($this->folder . '/' . $value))
$this->list[self::TYPEDIRS][] = $value;
else
$this->list[self::TYPEFILES][] = $value;
}
}


public function __construct($folder = '')
{
$this->setFolder($folder);
}

public function setFolder($folder = '')
{
if (is_dir(MDIR . '/' . $folder))
$this->folder = MDIR . '/' . $folder;
else
$this->folder = MDIR;
$this->readFolder();
}

public function getElements($type = self::TYPEALL, $folder = '')
{
if (!empty($folder)) $this->setFolder($folder);
if ($type == self::TYPEDIRS || $type == self::TYPEFILES)
return $this->list[$type];
else
return
array_merge($this->list[self::TYPEDIRS], $this->list[self::TYPEFILES]);
}
}

Спустя 9 минут, 45 секунд (23.07.2010 - 13:00) KaFe написал(а):
linker а ты не считаешь, что ты сделал в несколько раз все запутанней и длиннее, а это не гуд, текст из цитата твина тут кстати
Цитата (twin @ 23.07.2010 - 09:08)
Нужно же запутать все

Вообще не пойму зачем такое извращение. Объясни может я не догоняю и это дает офигенные плюсы??? или вместо двух методов дает нам целых четыре, тут плюс что ли?? dry.gif

Спустя 16 минут, 22 секунды (23.07.2010 - 13:16) linker написал(а):
$folder = new folder('dadada');
$folder->getElements();
$folder->getElements(folder::TYPEDIRS);
$folder->getElements(folder::TYPEFILES, 'tututu');
1. Не важно количество методов, важно насколько они самодостаточны и насколько ими удобно пользоваться.
2. Скорость, здесь присутствует элемент кэширования, т.е. вызов getElements не будет каждый раз перечитывать рабочую директорию.
3. Гибкость.
4. Простота последующего использования.

Спустя 15 минут, 45 секунд (23.07.2010 - 13:32) KaFe написал(а):
Ну не знаю, не знаю, все равно мне некоторые моменты не нравятся.

Спустя 4 минуты, 16 секунд (23.07.2010 - 13:37) linker написал(а):
KaFe
Задавай вопросы, отвечу, что не понятно и что смущает.

Спустя 9 минут, 36 секунд (23.07.2010 - 13:46) KaFe написал(а):
ну например я изначально пытался использовать MDIR один раз
        if (is_dir(MDIR . '/' . $folder))
$this->folder = MDIR . '/' . $folder;
else

А у вас их целых три, и мне это не нравится. Ладно давайте закончим обсуждение этой тему. У меня я чувствую скоро опять появятся вопросы laugh.gif Топик не закрывайте

Спустя 10 минут, 25 секунд (23.07.2010 - 13:57) linker написал(а):
KaFe
MDIR - это константа, значит значение ее неизменяемое и изначально известное, поэтому ею можно пользоваться сколько угодно много, без всяких заморочек.

Спустя 5 минут, 26 секунд (23.07.2010 - 14:02) KaFe написал(а):
Цитата (linker @ 23.07.2010 - 10:57)
MDIR - это константа, значит значение ее неизменяемое и изначально известное, поэтому ею можно пользоваться сколько угодно много, без всяких заморочек.

но это же противоречит.теории повторного использования кода wink.gif

Спустя 14 минут, 38 секунд (23.07.2010 - 14:17) Michael написал(а):
Цитата (KaFe @ 23.07.2010 - 13:02)
но это же противоречит.теории повторного использования кода wink.gif

зато не противоречит теории повторного использования констант. smile.gif

p.s. Если рябит глаза MDIR в классе, заведи поле const MyDir = MDIR;, присвой разок и им пользуйся(так: self::MyDir).

Спустя 42 минуты, 48 секунд (23.07.2010 - 14:59) linker написал(а):
KaFe
Если это противоречит повторному использованию кода, тогда MDIR вообще нельзя использовать ни разу. Если MDIR хоть раз используется в классе, значит противоречия нет, либо переписываем все с учетом твоих новых требований:
class folder extends Controller
{
const TYPEALL = -1;
const TYPEDIRS = 0;
const TYPEFILES = 1;
protected $folder = MDIR;
protected $list = array();
protected $basefolder = ".";

protected function readFolder()
{
$this->list = array();
$items = scandir ($this->folder);
foreach ($items as $key => $value)
{
if ($value == '.' || $value == '..') { continue; }
if (is_dir($this->folder . '/' . $value))
$this->list[self::TYPEDIRS][] = $value;
else
$this->list[self::TYPEFILES][] = $value;
}
}


public function __construct($basefolder = '', $folder = '')
{
if (!empty($basefolder)) $this->basefolder = $basefolder;
$this->setFolder($folder);
}

public function setFolder($folder = '')
{
if (is_dir($this->basefolder . '/' . $folder))
$this->folder = $this->basefolder . '/' . $folder;
else
$this->folder = $this->basefolder;
$this->readFolder();
}

public function getElements($type = self::TYPEALL, $folder = '')
{
if (!empty($folder)) $this->setFolder($folder);
if ($type == self::TYPEDIRS || $type == self::TYPEFILES)
return $this->list[$type];
else
return
array_merge($this->list[self::TYPEDIRS], $this->list[self::TYPEFILES]);
}
}


$folder = new folder('./..', 'dadada');
$folder = new folder(MDIR, 'dadada');

Спустя 12 минут, 18 секунд (23.07.2010 - 15:12) Basili4 написал(а):
Читая этот трейд я понял одно ООП это зло процедурками то что хотел сделать KaFe
делалось бы 3-5 строчками.

Спустя 8 минут, 7 секунд (23.07.2010 - 15:20) linker написал(а):
Basili4
В данном случае речь об ООП, процедурки это уже другой вопрос. ООП выглядит ужасно только на этапе разработки, при использовании готовых классов, все становится на свои места, где процедуркам места нет и не будет никогда.

Спустя 20 минут, 46 секунд (23.07.2010 - 15:41) twin написал(а):
Цитата
все становится на свои места, где процедуркам места нет и не будет никогда.

Всё становится с ног на голову. Вместо того, чтобы просто написать три строчки (как сказал Basili4), сначала нужно ужасно замарочиться на этапе разработки, как сказал linker, для того, чтобы потом (внимание!) написать три строчки. biggrin.gif
Как из анекдота, про негра под пальмой. Лежит он и банан жрет. Белый проходит и говорит - чего лежишь, бананы же прям в руки падают?
- и что?
- так собери и продай.
- и что?
- купи 100 банановых деревьев.
- и что?
- собери и продай. будет много денег.
- и что?
- будешь лежать и ничего не делать.
??????

Или если по русски - украли вагон водки, продали и деньги пропили.

Спустя 3 минуты, 42 секунды (23.07.2010 - 15:44) linker написал(а):
Напиши в три строчки, без глобальных переменных, кучи передаваемых параметров процедуркам и тому подобного. В данном случае всего две строчки "полезного" кода
$folder = new folder('', 'blabla');
$folder->getElements();

Спустя 6 минут, 21 секунда (23.07.2010 - 15:51) twin написал(а):
Я не вникал в суть. А что вообще нужно то?

Спустя 1 минута, 26 секунд (23.07.2010 - 15:52) linker написал(а):
twin
laugh.gif Вот, человек не вникая в суть и вообще не зная что нужно делать, пытается рассуждать о чем-то. Не важно что, главное что ООП - это г. и все обязательно можно решить тремя строчками процедурок.

Спустя 4 минуты, 5 секунд (23.07.2010 - 15:56) twin написал(а):
Я не вникал, потому что это мусор все. Мне оно не надо. Я видел ваши потуги с сеттерами и геттерами, которые нужны исключительно в классах (иначе просто не работают). И потерял всякий интерес.

Вот кто то здорово сказал - компьютер придумали для того, чтобы решать проблемы, которые до изобретения компьютера не существовали. Это гораздо больше подходит к ООП. Мне совершенно не нужно решать те проблемы, которые вы тут сами себе создали.

Я повторю вопрос - что нужно то? Для чего эта вся мышинная возня?
Озвучте изначальную проблему и посмотрим, как она лучше решается. Может я и не прав, будет мне наука.

Спустя 1 минута, 20 секунд (23.07.2010 - 15:57) Wird_34 написал(а):
Я в одну строчку напишу:
$list = get_folder_content();

Спустя 3 минуты, 8 секунд (23.07.2010 - 16:01) linker написал(а):
Цитата
Я не вникал, потому что это мусор все.
Всегда поражали такие люди. Я не знаю что это, но точно г. или наоборот. Сначала вникни, а потом раздавай характеристики.
Это не мои потуги с магическими методами, раз, два, читай первое сообщение ТС, там вроде все написано и не надо даже читать всю ветку. Плюс, константу MDIR нельзя использовать в своих процедурках, это выяснилось тока что.

Спустя 2 минуты, 2 секунды (23.07.2010 - 16:03) linker написал(а):
Wird_34
Ага, ну проверь работает ли твоя строчка.

Спустя 1 минута, 30 секунд (23.07.2010 - 16:04) Basili4 написал(а):
twin

надо сделать это

Цитата

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

$a = new folder;
$a->folder='babamanya';
$a->get_folder();


чтобы в классе делалось вот так
$this->folder = MDIR.'/'.$this->folder;


Более подробно в сабже

Спустя 1 минута, 57 секунд (23.07.2010 - 16:06) sergeiss написал(а):
Цитата (twin @ 23.07.2010 - 16:56)
Для чего эта вся мышинная возня?


Ответ - в заголовке темы: wink.gif
Цитата
Вопросы по классам, KaFe углубляется в ООП smile.gif


Ну дай ты людЯм поупражняться! Для них это - как гаммы для начинающего пианиста. Ясно дело, что на сцене их играть не будет, но для начальной тренировки нужны.

Можно, кстати, конкурс объявить: как сделать на ООП то, что для ООП вообще не предназначено? wink.gif

Спустя 40 секунд (23.07.2010 - 16:07) Wird_34 написал(а):
linker, а почему она не должна работать?

Спустя 6 минут, 58 секунд (23.07.2010 - 16:14) twin написал(а):
Цитата
Более подробно в сабже

Блин. Я читал этот пост. И потому и говорю - горе от ума.

Еще раз повторяю - это не та проблема, откуда растут ноги. Все запутано гораздо серьёзнее.

Что значит
Цитата
чтобы в классе делалось вот так
$this->folder = MDIR.'/'.$this->folder;

Для чего?

Это тоже самое, что мы проходили в прошлом холиваре с классом БД. Нужно написать кучу классов, нарожать наследников, а потом задавать такие абсолютно неинформативные вопросы на форуме.

Мол вот я машину собрал. Двигатель от белоруся, колеса от запорожца и еще там у меня куча всего есть. Как мне сделать так, чтобы пепельница сама вытряхивалась.

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

Дак взять просто рукой и вытряхнуть. Нет, не тру. Давай вникнем, давай изобретем.

Меня тоже всегда поражали люди, которые незная проблемы пытаются её решить. Да там может действительно две строчки надо, а нагородили тут...

sergeiss
Цитата
Ну дай ты людЯм поупражняться!

Да не вопрос, я и не втыкался. Но как мне прикажешь ответить на это:
Цитата
Напиши в три строчки, без глобальных переменных, кучи передаваемых параметров процедуркам и тому подобного. В данном случае всего две строчки "полезного" кода
$folder = new folder('', 'blabla');
$folder->getElements();
если я понятия не имею для чего это вообще нужно?

Спустя 1 минута, 59 секунд (23.07.2010 - 16:16) linker написал(а):
Wird_34
Ну когда господа разрабы PHP сподобятся и напишут функцию get_folder_content(), тогда и заработает.
twin
Цитата
место того, чтобы просто написать три строчки (как сказал Basili4), сначала нужно ужасно замарочиться на этапе разработки, как сказал linker, для того, чтобы потом (внимание!) написать три строчки.
думается иногда лучше промолчать, прежде чем ляпнуть что-то. Если ты не знаешь, для чего, зачем и что вообще тут обсуждается, имхо, нужно реально промолчать или докончить свои слова делом.

Спустя 1 минута, 36 секунд (23.07.2010 - 16:17) sergeiss написал(а):
Цитата (linker @ 23.07.2010 - 17:01)
Всегда поражали такие люди. Я не знаю что это, но точно г. или наоборот. Сначала вникни, а потом раздавай характеристики.

Ты знаешь... В моей жизни был один очень интересный эпизод. Не имеющий прямого отношения к рассматриваемой основной теме. Но имеющий отношение к "раздаче характеристик".
Вот однажды мне пытались объяснить, что одна хрень будет работать... А я сразу говорю: "противоречит закону сохранения энергии!". А мне говорят: "но ты посмотри, подумай, тут вот так, тут вот эдак да развоттак....". А я даже не вникаю в детали и всё своё говорю: "противоречит...".

Вот и Твин так же. Видит - противоречит здравому смыслу, так об этом и говорит. И зачем ему во что-то вникать, если противоречит? wink.gif

Спустя 1 минута, 33 секунды (23.07.2010 - 16:19) Wird_34 написал(а):
Цитата (linker @ 23.07.2010 - 20:16)
Wird_34
Ну когда господа разрабы PHP сподобятся и напишут функцию get_folder_content(), тогда и заработает.

Ясное дело функция определена программистом и ее код практически в точности идентичен методу getElements(). Ты же в те две строчки не включил код класса, вот я и не включил код функции smile.gif

Спустя 5 минут, 32 секунды (23.07.2010 - 16:24) linker написал(а):
sergeiss
Извини, но тут только отчасти так. Twin увидел заветное слово ООП и как бык на красную тряпку кинулся на амбразуру. В глобальном смысле, конечно же, ООП тут собственно и не нужен, но ТС изначально спрашивал в контексте классов-объектов.
Wird_34
Если ты не заметил, то несколькими постами выше, была реализация заветного getElements().

Спустя 13 минут, 39 секунд (23.07.2010 - 16:38) Wird_34 написал(а):
linker, пока писал функцию нашел у тебя ошибку... И не одну. Те две строчки работать не будут.

Реализация в виде функции:
define('CONTENT_FOLDERS', 1);
define('CONTENT_FILES', 2);
define('CONTENT_ALL', 3);

function get_folder_content( $path, $content_type )
{
if ( !is_dir($path) ) {
return FALSE;
}

$list = array();
$items = scandir($path);
foreach ( $items as $value ) {
if ( $value == '.' || $value == '..' ) {
continue;
} elseif ( is_dir($path . '/' . $value) ) {
$list[CONTENT_FOLDERS][] = $value;
} else {
$list[CONTENT_FILES][] = $value;
}
}


if ( $content_type == CONTENT_FOLDERS || $content_type == CONTENT_FILES )
return $list[$content_type];
elseif ( $content_type == CONTENT_ALL ) {
return array_merge($list[CONTENT_FOLDERS], $list[CONTENT_FILES]);
} else {
return FALSE;
}
}

Спустя 1 час, 50 минут, 23 секунды (23.07.2010 - 18:28) twin написал(а):
Цитата
Twin увидел заветное слово ООП и как бык на красную тряпку кинулся на амбразуру.

Неверное наблюдение. Я мирно хрустел попкорном и булькал кокаколой, наблюдая как вы переливаете из пустого в порожнее. По поводу этого и ерничал высказывал свое мнение. smile.gif

Я не вникал в суть, так как из первого поста было ясно, что это все очередная попытка сделать из мухи слона. Придумать себе головняк и пытаться потом выкрутиться из него, опутывая мизерную задачу все большими и большими проблемами. Это и называется неправильное проектирование. Вернее полное его отсутствие.

В ООП так нельзя, и linker не сможет со мной не согласиться. Тут нужно всю картину представлять сразу. В отличии от процедурки, где проблемы легко решаются по мере их поступления. Что очень изящно продемонстрировал Wird_34. За что ему огромный респект. smile.gif

Спустя 57 минут, 48 секунд (23.07.2010 - 19:26) KaFe написал(а):
twin ты прав что ООП, здесь не решает ни чего, даже усложняет. Я кто предложил эту всю муть знаю, что с помощью функции это можно было решить без проблем, да и как сказал Basili4 в 3 строки.

Но весь перчик в том, как сказал sergeiss, что пусть по упражняются, тема с этим учетом и создана.

Да и вообще мне не нравится ООП в PHP, ну не нужно оно в нем, и изучаю всего лишь потому что это модная тенденция, за которую модно платят wink.gif

Спустя 2 дня, 12 часов, 38 минут, 7 секунд (26.07.2010 - 08:04) linker написал(а):
Есть вопрос, а чем ООП не нравится в ПХП? Да, это не C++, но по сравнению с другими скриптовыми языками ПХП явно в выигрыше.
В примере Wird_34 все хорошо, вот только папка читается и массив собирается каждый раз при вызове функции с одним и тем же путем, а оно надо?

Спустя 51 минута, 55 секунд (26.07.2010 - 08:56) twin написал(а):
Цитата
вот только папка читается и массив собирается каждый раз при вызове функции с одним и тем же путем, а оно надо?
Та ни божешь мой. Есть такая замечательная штука, как static. И опять проблема решается двумя строчками.

Спустя 1 час, 12 минут, 51 секунда (26.07.2010 - 10:09) linker написал(а):
twin
Статик, глобалс и понеслись костыли по кочкам.

Спустя 18 минут, 46 секунд (26.07.2010 - 10:28) twin написал(а):
Ну конечно. Гетеры-сеттеры знач не костыли. А статик - костыль.

А с чего ради кстати? Ну с глобалс (и то с огромной натяжкой) я могу согласиться. А статик то чем обидел?

Спустя 1 день, 6 часов, 26 минут, 11 секунд (27.07.2010 - 16:54) gzim9x написал(а):
Война мнений "ООП против процедурок" -- отголосок еще большей войны мнений "C против C++" (кстати PHP написан именно на C...) -- а там уже десятилетия не могут договориться smile.gif

Спустя 6 минут, 32 секунды (27.07.2010 - 17:01) Basili4 написал(а):
Холивар у людей в крови. Возьми ту же религию до сих пор грызутся какая "книжка сказок" правдивие smile.gif

Спустя 1 месяц, 27 дней, 16 минут, 30 секунд (24.09.2010 - 17:17) Dingo написал(а):
И так, продолжим тему...... biggrin.gif У меня вопросы, сейчас же они связаны с теорией, а именно с шаблонами проектирования.
На данный момент я вник в суть двух шаблонов проектирования, а именно
  • Singleton
  • Strategy
Сейчас пришел к изучению фабрик. Сперва Factory Method.
Въехать вообще не могу, перечитал 2 раза, все равно въехать не могу sad.gif , может кто нибудь попроще объяснит, чем это делает Мэтт Зандстра, буду очень благодарен.

Спустя 2 минуты, 1 секунда (24.09.2010 - 17:19) twin написал(а):
Тему новую создай

Спустя 1 минута, 1 секунда (24.09.2010 - 17:20) Dingo написал(а):
twin а нужно?

Спустя 8 минут, 9 секунд (24.09.2010 - 17:28) ZSH написал(а):
потихоньку вникаю в OOП PHP.

и оФигеть мнение twin`a насчет OOП PHP мне понятно.

нафиг нужно

Спустя 16 минут, 57 секунд (24.09.2010 - 17:45) Dingo написал(а):
ZSH плохо вникаешь значит, я придерживаюсь процедурного метода, но понимаю, что ООП все таки нужен для о расширяем систем, в которых существует возможность создания множества сущностей(объектов), которые минимально должны влиять друг на друга.

P.S: Никто не поможет ? sad.gif
P.S.S: Был бы здесь linker sad.gif sad.gif

Спустя 10 минут, 6 секунд (24.09.2010 - 17:55) twin написал(а):
Тему новую нужно. Это полезно для поисковок. Новый вопрос - новая тема.
А тут сплошной холивар.

Изучать ООП нужно, хотябы потому, что много чего на нем написано. Столкнешься и заблудишься.

Спустя 1 минута, 57 секунд (24.09.2010 - 17:57) Dingo написал(а):
twin окей создам wink.gif

Спустя 6 минут, 13 секунд (24.09.2010 - 18:03) ZSH написал(а):
Цитата
Изучать ООП нужно, хотябы потому, что много чего на нем написано. Столкнешься и заблудишься.

согласен но в каждом проекте свои требования и процедуркой писать тяжелее но в результате эфективнее

Спустя 8 часов, 19 минут, 3 секунды (25.09.2010 - 02:23) Guest написал(а):
Странно чем это эффективней, не пере используемостью кода и локализацией ошибок ?

Спустя 4 часа, 7 минут, 22 секунды (25.09.2010 - 06:30) Guest написал(а):
Цитата (Guest @ 24.09.2010 - 23:23)
не пере используемостью кода и локализацией ошибок ?

если вы не знали дорогой друг, то в функциях тоже можно локализовать ошибки.

Спустя 3 дня, 11 часов, 17 минут, 22 секунды (28.09.2010 - 17:47) Guest написал(а):
Цитата (Guest @ 25.09.2010 - 03:30)
Цитата (Guest @ 24.09.2010 - 23:23)
не пере используемостью кода и локализацией ошибок ?

если вы не знали дорогой друг, то в функциях тоже можно локализовать ошибки.

дорогой друг а кто говорит за функции и локализацию ошибок в пределе функции!?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.