Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Обращение с классами в фреймворке CI
Как расшифровать вот эту строку $this->load->view('mainviwe');?
И где она будет работать? Создал свой класс, там она уже не пашет
avtor.fox
Отправлено: 14 Декабря, 2012 - 19:33:37
Постоянный участник
Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012 Откуда: Воронеж
Помог: 50 раз(а)
createl основы то есть?
createl
Отправлено: 14 Декабря, 2012 - 19:42:50
Гость
Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012
Помог: 0 раз(а)
avtor.fox пишет:
createl основы то есть?
Есть. вот view('mainviwe') Это вроде как обращение к функции с передачей параметра. $this, что то вроде указания на текущий класс. А load что такое, где он базируется, и зачем нужен?
Toxa
Отправлено: 14 Декабря, 2012 - 19:47:27
Посетитель
Покинул форум
Сообщений всего: 352
Дата рег-ции: Окт. 2008
Получается load находится в классе CI_Controller и является ничем инным как фукцией? А view('mainviwe') это как параметр у load? Я правильно мыслю? А если я хочу создать свой класс его тоже нужно подгружать через load?
Toxa
Отправлено: 14 Декабря, 2012 - 20:25:37
Посетитель
Покинул форум
Сообщений всего: 352
Дата рег-ции: Окт. 2008
Помог: 8 раз(а)
[+]
так, все контроллеры имеют в качестве свойства объект класса Loader (см. Core/Loader)
У этого Loader'a имеются методы (view, database, model и т.д.), которые в качестве параметров получают имена загружаемых файлов. То есть строка
Означает, что у текущего класса есть объект Loader, который доступен в свойстве $this->load и мы вызываем метод view объекта Loader, передавая ему в качестве параметра строку 'mainview'.
Что касается собственных классов.
Во-первых надо определиться для чего они тебе нужны. Если это контроллер, то создаешь ты его в папке с контроллерами и наследуешь от CI_Controller,
Если тебе нужны классы-помошники, то уже создаешь helper или библиотеку (см liblaries)
Все классы подключаются через $this->load, за исключением указанных в конфиге, они подключаются автоматически.
Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012
Помог: 0 раз(а)
Пару дней втыкал в написанное, и кажется, на меня снизошло прозрение(не все еще домыслил, но уже не в тупике). Огромная благодарность тебе, уважаемый Toxa, за трату драгоценного времени на объяснения.
Удалось получить доступ к load в своем классе, наследнике контроллера в папке controllers, прописав простейшую строку parent::__construct(); в классе контроллера и в своем классе. Но, подозреваю, что такое решение не является верным, поскольку функция существует, как мне кажется, для того, чтобы не грузить все классы которые имеются, а делать это выборочно, чтобы снизить нагрузку на систему. А я таким решением, должно быть, ее утроил Поэтому попробую поискать замену своему классу в мануале - наверняка предусмотрели разработчики.
В строке
не совсем понятен вот этот знак =&. Это, случаем, не фишка php4?
tato
Отправлено: 17 Декабря, 2012 - 09:23:16
Посетитель
Покинул форум
Сообщений всего: 468
Дата рег-ции: Сент. 2011 Откуда: Владивосток
Помог: 8 раз(а)
createl, "функции" которые написанны в теле класса называются методами.
----- просто ?: сложно
createl
Отправлено: 17 Декабря, 2012 - 13:38:10
Гость
Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012
Помог: 0 раз(а)
Критика принята, буду учиться называть вещи своими именами
Toxa
Отправлено: 17 Декабря, 2012 - 13:56:05
Посетитель
Покинул форум
Сообщений всего: 352
Дата рег-ции: Окт. 2008
Помог: 8 раз(а)
[+]
нет нет, насчет parent::__construct() ты все правильно сделал.
Смотри, метод __construct вызывается при создании экземпляра класса, то есть когда создается объект твоего класса, интерпретатор ищет метод __constuct() внутри него. Если такого не обнаружилось, то он вызывает тот же метод родительского класса, то есть CI_Controller'a. Но если ты у себя в классе объявишь __constuct(), то метод родительского класса вызван не будет (потому что ты его переписал), а должен быть. Поэтому во всех контроллерах надо писать
На самом деле я тоже начинал изучение фреймворков с CI и тоже охуевал первое время от сложности кода, это нормально. Я помню как читал статьи на хабре по Zend'у и не понимал в нем ни слова.
Для начинающих же CI отличный вариант.
// Note: We use exit() rather then show_error() in order to avoid a
// self-referencing loop with the Excptions class
exit('Unable to locate the specified class: '.$class.EXT);
}
// Keep track of what we just loaded
is_loaded($class);
$_classes[$class]=new$name();
return$_classes[$class];
}
Дело в том, что CI построен на принципе жосткого сингелтона, это значит, что все классы загружаются лишь единожды и их объекты хранятся в статическом массиве $_classes внутри функции load_class. Ну так вот чтобы сборщик мусора случайно не убил какой-либо из объектов, все они передаются по ссылке. На эту тему масса статей в интернете, скажу лишь, что понимать это не обязательно, можно и без этого освоить фреймворк.
Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012
Помог: 0 раз(а)
Toxa пишет:
нет нет, насчет parent::__construct() ты все правильно сделал.
Это даже в мануале написано - при перечитывании заметил))
Вообще хотел написать класс вывода данных из бд для всех контроллеров, чтобы вывод был для всех одинаков за исключением некоторых тонкостей плюс с использованием стандартных решений самого фреймворка и при желании, чтобы можно было изменить(если приспичит) вывод для любого из контроллеров не вмешиваясь в работу дргуих. Собственно можно было и так как я хотел сделать, но модели именно то, что доктор прописал.
Toxa пишет:
Для начинающих же CI отличный вариант
Тоже так подумал, что с более простого начать нужно. Еще поковырял yii, но чет рановато пока.
Столкнулся еще со странным поведением. Когда в контроллере используешь свой метод а не function index(), то шаблон почему отображается без css, хотя путь к нему нормально прописан. Завтра буду пытаться допетрить почему так. Возможно какието нестыковки из за htacess..
Вот еще очень интересующий вопрос. Заметил в CI, что в функции часто приходит разное количество переменных, при ее вызове. Как достигается чтобы она не "ругалась", на случай, если какая то переменная не установлена?
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
function food($food,$milk=true,$cheese=15){}
food($arr);
food($arr,false);...
createl
Отправлено: 20 Декабря, 2012 - 14:05:09
Гость
Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012
Помог: 0 раз(а)
LIME пишет:
function food($food,$milk=true,$cheese=15){}
food($arr);
food($arr,false);...
Ай да я!.. Не знал, что так можно. Спасибо, очень полезная вещь. Как раз нужно применить))
createl
Отправлено: 20 Декабря, 2012 - 18:37:59
Гость
Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012
Помог: 0 раз(а)
createl пишет:
Столкнулся еще со странным поведением. Когда в контроллере используешь свой метод а не function index(), то шаблон почему отображается без css, хотя путь к нему нормально прописан. Завтра буду пытаться допетрить почему так. Возможно какието нестыковки из за htacess..
(самый прикол мозила css к шаблону не прилепляла, но почему то сам css там был доступен, из за чего себе голову сломал - спас хором) . Получается файл css ищется в несуществующей директории. И в файле css ссылки на картинки тоже получаются неправильные по этой причине. Теперь непонятно что делать из за этих человеку понятных урл. Пока только хватило соображаловки на то, чтобы прописать полные пути типа http и тд
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.