И так вот мой первый вопрос: у меня есть класс, точнее пишу класс, а точнее писал, пока не наткнулся на такую проблему, вот текста класса.
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 написал(а):
Может я конечно и не прав, тк тоже относительно недавно сел плотно зо ООП.
Но проще переменную сразу передать в функцию
$
А константа MDIR она и в функциях и в классах должна быть доступна
Ну или где она там тебе нужна
Но проще переменную сразу передать в функцию
$
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. Это класс целеком?
Я просто как-то пробовал применить __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 теряет смысл. Она ведь вроде как при вызове переменной, которой не существует в классе, присваивает значение какой-нибудь подготовленной для этого переменной в классе. А у тебя четко заданы рамки
А так как у тебя она инициализируется мне кажется вообще неправильно, так как функция __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 написал(а):
Ладно, впринцепе все это ерунда, но тогда уже лучше сделать так:
Тогда ты по идеи сможешь любое имя переменной прописать, которой нет в классе или которая является закрытой, и она присвоит значение переменной $this->dir, Но какой-то выгоды от этого, я лично вообще не вижу...
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 я чувствовал что с вами беседа проста бесполезна, так как в концов вы выдали не работающий как надо листинг кода.
Спустя 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 - Вы ее используете не по назначению. И потому я спрашивал зачем Вы ее вообще в свой код впихнули.
А вообще почитайте мануал, там четко сказано для чего нужна функция __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 а если мне нужно сменить папку с которой я работаю, то как мне быть???
Спустя 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. Смысл его в том, что при первом обращении к классу ты задаешь настройки и создается его копия и при всех последующих к нему обращениях ты пользуешься его копией. Надеюсь понятно написал. Я тут по быстрому накидал его примерчик - протестируй и все поймешь... Ну а свою под свою функцию уже сам подделывай.
Я в этом случаи использую Паттерн 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 а мне это зачем ?
Спустя 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 такой метод уже обсуждался в предыдущих постах, он не подошел из за своей не эстетичности
нужно что было вот так
нужно что было вот так
$a->folder = 'kernel';
Спустя 12 секунд (23.07.2010 - 10:48) igor717 написал(а):
Для того чтобы понять как она работает ее не нужно запускать.
Я подобную функцию использую для сканирования директории с модулями у меня он используется только для этого. Просто я лично уже совсем запутался что тебе нужно в итоге.
У тебя изначально был готовый ее вариант, а ты полез в __set, вот и все.
Я подобную функцию использую для сканирования директории с модулями у меня он используется только для этого. Просто я лично уже совсем запутался что тебе нужно в итоге.
У тебя изначально был готовый ее вариант, а ты полез в __set, вот и все.
Спустя 2 минуты, 39 секунд (23.07.2010 - 10:51) linker написал(а):
Я что-то упустил, в чем проявляется неэстетичность?
вот так
вот так
$a->folder = 'kernel';дурной тон в ООП.
Спустя 40 секунд (23.07.2010 - 10:51) Michael написал(а):
KaFe, отвечу тебе именно на твой вопрос .
Задумка ясна, но с __set не получится. Он вызовется только первый раз, когда свойство не определено в объекте, а при следующих присвоениях вызываться не будет.
Решение - выше от linker-а.
Задумка ясна, но с __set не получится. Он вызовется только первый раз, когда свойство не определено в объекте, а при следующих присвоениях вызываться не будет.
Решение - выше от linker-а.
Спустя 1 минута, 3 секунды (23.07.2010 - 10:52) KaFe написал(а):
Michael а ты проверял??? У меня такое ощущение, что здесь тусуются одни теоретики..... У меня все работает с вариантом __set
Цитата |
дурной тон в ООП. |
Где написано???? Статью
Спустя 1 минута, 41 секунда (23.07.2010 - 10:54) glock18 написал(а):
KaFe
пока устное предупреждение. igor717 пытался тебе помочь, а первым кто здесь написал глупость, был ты, когда припахал сюда совершенно безосновательно __set.
суть вопроса вообще не ясна. то ли ты хочешь другие решения увидеть (последний пост linker здесь самый раз), то ли преследуешь какие-то другие цели - непонятно.
пока устное предупреждение. 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)бред и неправильно, хоть и рабочее. Имхо, правильное применение __set и __get с динамическими полями класса
{
if ($var == 'folder') $this->dir = MDIR.$value;
}
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, я привел вариант, и просил совета как можно сделать по другому.
linker кукую книгу?? Название.
Да и еще по поводу __set, я привел вариант, и просил совета как можно сделать по другому.
Спустя 54 секунды (23.07.2010 - 11:04) KaFe написал(а):
Я знаю что это пахнет бредом, НО как сделать по другому
Спустя 2 минуты, 40 секунд (23.07.2010 - 11:07) linker написал(а):
Цитата (KaFe @ 23.07.2010 - 08:04) |
Я знаю что это пахнет бредом, НО как сделать по другому |
Я тебе написал как правильно и эстетично.
Бьерн Страуструп. Язык программирования С++
Спустя 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 написал(а):
Короче буду думать сам ведь тут бесполезно что-то выяснять
Спустя 25 минут, 36 секунд (23.07.2010 - 11:52) linker написал(а):
А чего тут думать?
Спустя 14 минут, 2 секунды (23.07.2010 - 12:06) KaFe написал(а):
linker ну вот так я примерно надумал
Добавил type для получение dir - папок, file - файлов ну и получение всех элементов папки
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
Цитата |
А чего тут думать? |
Как что... Нужно же запутать все, очевидное не тру.
Все же очень прав Стерлинг Хьюз
Цитата |
...всё ООП состоит из превращения уже имеющихся задач в новые. И уже только потом дело доходит до их решения. |
Спустя 42 минуты, 46 секунд (23.07.2010 - 12:50) linker написал(а):
KaFe
Пойдем по порядку.
1. Поля класса известны и жестко определены? Да. Это:
folder - текущая рабочая папка
list - список папок/файлов
2. Т.к. поля жестко заданы, то есть ли необходимость использования __set? Нет. Значит при проектировании класса это учитываем.
На коленке получилось
Пойдем по порядку.
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) |
Нужно же запутать все |
Вообще не пойму зачем такое извращение. Объясни может я не догоняю и это дает офигенные плюсы??? или вместо двух методов дает нам целых четыре, тут плюс что ли??
Спустя 16 минут, 22 секунды (23.07.2010 - 13:16) linker написал(а):
$folder = new folder('dadada');1. Не важно количество методов, важно насколько они самодостаточны и насколько ими удобно пользоваться.
$folder->getElements();
$folder->getElements(folder::TYPEDIRS);
$folder->getElements(folder::TYPEFILES, 'tututu');
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
А у вас их целых три, и мне это не нравится. Ладно давайте закончим обсуждение этой тему. У меня я чувствую скоро опять появятся вопросы Топик не закрывайте
Спустя 10 минут, 25 секунд (23.07.2010 - 13:57) linker написал(а):
KaFe
MDIR - это константа, значит значение ее неизменяемое и изначально известное, поэтому ею можно пользоваться сколько угодно много, без всяких заморочек.
MDIR - это константа, значит значение ее неизменяемое и изначально известное, поэтому ею можно пользоваться сколько угодно много, без всяких заморочек.
Спустя 5 минут, 26 секунд (23.07.2010 - 14:02) KaFe написал(а):
Цитата (linker @ 23.07.2010 - 10:57) |
MDIR - это константа, значит значение ее неизменяемое и изначально известное, поэтому ею можно пользоваться сколько угодно много, без всяких заморочек. |
но это же противоречит.теории повторного использования кода
Спустя 14 минут, 38 секунд (23.07.2010 - 14:17) Michael написал(а):
Цитата (KaFe @ 23.07.2010 - 13:02) |
но это же противоречит.теории повторного использования кода |
зато не противоречит теории повторного использования констант.
p.s. Если рябит глаза MDIR в классе, заведи поле const MyDir = MDIR;, присвой разок и им пользуйся(так: self::MyDir).
Спустя 42 минуты, 48 секунд (23.07.2010 - 14:59) linker написал(а):
KaFe
Если это противоречит повторному использованию кода, тогда MDIR вообще нельзя использовать ни разу. Если MDIR хоть раз используется в классе, значит противоречия нет, либо переписываем все с учетом твоих новых требований:
Если это противоречит повторному использованию кода, тогда 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 строчками.
делалось бы 3-5 строчками.
Спустя 8 минут, 7 секунд (23.07.2010 - 15:20) linker написал(а):
Basili4
В данном случае речь об ООП, процедурки это уже другой вопрос. ООП выглядит ужасно только на этапе разработки, при использовании готовых классов, все становится на свои места, где процедуркам места нет и не будет никогда.
В данном случае речь об ООП, процедурки это уже другой вопрос. ООП выглядит ужасно только на этапе разработки, при использовании готовых классов, все становится на свои места, где процедуркам места нет и не будет никогда.
Спустя 20 минут, 46 секунд (23.07.2010 - 15:41) twin написал(а):
Цитата |
все становится на свои места, где процедуркам места нет и не будет никогда. |
Всё становится с ног на голову. Вместо того, чтобы просто написать три строчки (как сказал Basili4), сначала нужно ужасно замарочиться на этапе разработки, как сказал linker, для того, чтобы потом (внимание!) написать три строчки.
Как из анекдота, про негра под пальмой. Лежит он и банан жрет. Белый проходит и говорит - чего лежишь, бананы же прям в руки падают?
- и что?
- так собери и продай.
- и что?
- купи 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
Вот, человек не вникая в суть и вообще не зная что нужно делать, пытается рассуждать о чем-то. Не важно что, главное что ООП - это г. и все обязательно можно решить тремя строчками процедурок.
Вот, человек не вникая в суть и вообще не зная что нужно делать, пытается рассуждать о чем-то. Не важно что, главное что ООП - это г. и все обязательно можно решить тремя строчками процедурок.
Спустя 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 нельзя использовать в своих процедурках, это выяснилось тока что.
Это не мои потуги с магическими методами, раз, два, читай первое сообщение ТС, там вроде все написано и не надо даже читать всю ветку. Плюс, константу 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) |
Для чего эта вся мышинная возня? |
Ответ - в заголовке темы:
Цитата |
Вопросы по классам, KaFe углубляется в ООП |
Ну дай ты людЯм поупражняться! Для них это - как гаммы для начинающего пианиста. Ясно дело, что на сцене их играть не будет, но для начальной тренировки нужны.
Можно, кстати, конкурс объявить: как сделать на ООП то, что для ООП вообще не предназначено?
Спустя 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
Ну когда господа разрабы PHP сподобятся и напишут функцию get_folder_content(), тогда и заработает.
twin
Цитата |
место того, чтобы просто написать три строчки (как сказал Basili4), сначала нужно ужасно замарочиться на этапе разработки, как сказал linker, для того, чтобы потом (внимание!) написать три строчки. |
думается иногда лучше промолчать, прежде чем ляпнуть что-то. Если ты не знаешь, для чего, зачем и что вообще тут обсуждается, имхо, нужно реально промолчать или докончить свои слова делом.
Спустя 1 минута, 36 секунд (23.07.2010 - 16:17) sergeiss написал(а):
Цитата (linker @ 23.07.2010 - 17:01) |
Всегда поражали такие люди. Я не знаю что это, но точно г. или наоборот. Сначала вникни, а потом раздавай характеристики. |
Ты знаешь... В моей жизни был один очень интересный эпизод. Не имеющий прямого отношения к рассматриваемой основной теме. Но имеющий отношение к "раздаче характеристик".
Вот однажды мне пытались объяснить, что одна хрень будет работать... А я сразу говорю: "противоречит закону сохранения энергии!". А мне говорят: "но ты посмотри, подумай, тут вот так, тут вот эдак да развоттак....". А я даже не вникаю в детали и всё своё говорю: "противоречит...".
Вот и Твин так же. Видит - противоречит здравому смыслу, так об этом и говорит. И зачем ему во что-то вникать, если противоречит?
Спустя 1 минута, 33 секунды (23.07.2010 - 16:19) Wird_34 написал(а):
Цитата (linker @ 23.07.2010 - 20:16) |
Wird_34 Ну когда господа разрабы PHP сподобятся и напишут функцию get_folder_content(), тогда и заработает. |
Ясное дело функция определена программистом и ее код практически в точности идентичен методу getElements(). Ты же в те две строчки не включил код класса, вот я и не включил код функции
Спустя 5 минут, 32 секунды (23.07.2010 - 16:24) linker написал(а):
sergeiss
Извини, но тут только отчасти так. Twin увидел заветное слово ООП и как бык на красную тряпку кинулся на амбразуру. В глобальном смысле, конечно же, ООП тут собственно и не нужен, но ТС изначально спрашивал в контексте классов-объектов.
Wird_34
Если ты не заметил, то несколькими постами выше, была реализация заветного getElements().
Извини, но тут только отчасти так. 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 увидел заветное слово ООП и как бык на красную тряпку кинулся на амбразуру. |
Неверное наблюдение. Я мирно хрустел попкорном и булькал кокаколой, наблюдая как вы переливаете из пустого в порожнее. По поводу этого и
Я не вникал в суть, так как из первого поста было ясно, что это все очередная попытка сделать из мухи слона. Придумать себе головняк и пытаться потом выкрутиться из него, опутывая мизерную задачу все большими и большими проблемами. Это и называется неправильное проектирование. Вернее полное его отсутствие.
В ООП так нельзя, и linker не сможет со мной не согласиться. Тут нужно всю картину представлять сразу. В отличии от процедурки, где проблемы легко решаются по мере их поступления. Что очень изящно продемонстрировал Wird_34. За что ему огромный респект.
Спустя 57 минут, 48 секунд (23.07.2010 - 19:26) KaFe написал(а):
twin ты прав что ООП, здесь не решает ни чего, даже усложняет. Я кто предложил эту всю муть знаю, что с помощью функции это можно было решить без проблем, да и как сказал Basili4 в 3 строки.
Но весь перчик в том, как сказал sergeiss, что пусть по упражняются, тема с этим учетом и создана.
Да и вообще мне не нравится ООП в PHP, ну не нужно оно в нем, и изучаю всего лишь потому что это модная тенденция, за которую модно платят
Но весь перчик в том, как сказал sergeiss, что пусть по упражняются, тема с этим учетом и создана.
Да и вообще мне не нравится ООП в PHP, ну не нужно оно в нем, и изучаю всего лишь потому что это модная тенденция, за которую модно платят
Спустя 2 дня, 12 часов, 38 минут, 7 секунд (26.07.2010 - 08:04) linker написал(а):
Есть вопрос, а чем ООП не нравится в ПХП? Да, это не C++, но по сравнению с другими скриптовыми языками ПХП явно в выигрыше.
В примере Wird_34 все хорошо, вот только папка читается и массив собирается каждый раз при вызове функции с одним и тем же путем, а оно надо?
В примере 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...) -- а там уже десятилетия не могут договориться
Спустя 6 минут, 32 секунды (27.07.2010 - 17:01) Basili4 написал(а):
Холивар у людей в крови. Возьми ту же религию до сих пор грызутся какая "книжка сказок" правдивие
Спустя 1 месяц, 27 дней, 16 минут, 30 секунд (24.09.2010 - 17:17) Dingo написал(а):
И так, продолжим тему...... У меня вопросы, сейчас же они связаны с теорией, а именно с шаблонами проектирования.
На данный момент я вник в суть двух шаблонов проектирования, а именно
Въехать вообще не могу, перечитал 2 раза, все равно въехать не могу , может кто нибудь попроще объяснит, чем это делает Мэтт Зандстра, буду очень благодарен.
На данный момент я вник в суть двух шаблонов проектирования, а именно
- Singleton
- Strategy
Въехать вообще не могу, перечитал 2 раза, все равно въехать не могу , может кто нибудь попроще объяснит, чем это делает Мэтт Зандстра, буду очень благодарен.
Спустя 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 мне понятно.
нафиг нужно
и оФигеть мнение twin`a насчет OOП PHP мне понятно.
нафиг нужно
Спустя 16 минут, 57 секунд (24.09.2010 - 17:45) Dingo написал(а):
ZSH плохо вникаешь значит, я придерживаюсь процедурного метода, но понимаю, что ООП все таки нужен для о расширяем систем, в которых существует возможность создания множества сущностей(объектов), которые минимально должны влиять друг на друга.
P.S: Никто не поможет ?
P.S.S: Был бы здесь linker
P.S: Никто не поможет ?
P.S.S: Был бы здесь linker
Спустя 10 минут, 6 секунд (24.09.2010 - 17:55) twin написал(а):
Тему новую нужно. Это полезно для поисковок. Новый вопрос - новая тема.
А тут сплошной холивар.
Изучать ООП нужно, хотябы потому, что много чего на нем написано. Столкнешься и заблудишься.
А тут сплошной холивар.
Изучать ООП нужно, хотябы потому, что много чего на нем написано. Столкнешься и заблудишься.
Спустя 1 минута, 57 секунд (24.09.2010 - 17:57) Dingo написал(а):
twin окей создам
Спустя 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) | ||
если вы не знали дорогой друг, то в функциях тоже можно локализовать ошибки. |
дорогой друг а кто говорит за функции и локализацию ошибок в пределе функции!?