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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
createl
Отправлено: 14 Декабря, 2012 - 19:31:50
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




Здравствуйте. Начал осваивать ООП, на примере фреймворка CI. То что удалось вычитать в теории вроде понятно, но на практике сразу неизвестные строки.
PHP:
скопировать код в буфер обмена
  1. class Main extends CI_Controller {
  2.  
  3.         function index()
  4.         {
  5.                 $this->load->view('mainviwe');
  6.                
  7.                 if (include ('search_vclass.php')) echo "WORK";
  8.                 $list_cat = New Search_category('main');
  9.                
  10.         }

Как расшифровать вот эту строку $this->load->view('mainviwe');?
И где она будет работать? Создал свой класс, там она уже не пашет
 
 Top
avtor.fox
Отправлено: 14 Декабря, 2012 - 19:33:37
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


Помог: 50 раз(а)




createl основы то есть?
 
 Top
createl
Отправлено: 14 Декабря, 2012 - 19:42:50
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




avtor.fox пишет:
createl основы то есть?

Есть. вот view('mainviwe') Это вроде как обращение к функции с передачей параметра. $this, что то вроде указания на текущий класс. А load что такое, где он базируется, и зачем нужен?
 
 Top
Toxa
Отправлено: 14 Декабря, 2012 - 19:47:27
Post Id



Посетитель


Покинул форум
Сообщений всего: 352
Дата рег-ции: Окт. 2008  


Помог: 8 раз(а)

[+]


load - это ссылка на загрузчик классов из ядра

PHP:
скопировать код в буфер обмена
  1. $this->load =& load_class('Loader', 'core');


-----
Удобный сервис для хранения файлов
 
 Top
createl
Отправлено: 14 Декабря, 2012 - 20:03:49
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




Toxa пишет:
load - это ссылка на загрузчик классов из ядра

PHP:
скопировать код в буфер обмена
  1. $this->load =& load_class('Loader', 'core');

Получается load находится в классе CI_Controller и является ничем инным как фукцией? А view('mainviwe') это как параметр у load? Я правильно мыслю? А если я хочу создать свой класс его тоже нужно подгружать через load?
 
 Top
Toxa
Отправлено: 14 Декабря, 2012 - 20:25:37
Post Id



Посетитель


Покинул форум
Сообщений всего: 352
Дата рег-ции: Окт. 2008  


Помог: 8 раз(а)

[+]


так, все контроллеры имеют в качестве свойства объект класса Loader (см. Core/Loader)
У этого Loader'a имеются методы (view, database, model и т.д.), которые в качестве параметров получают имена загружаемых файлов. То есть строка

Означает, что у текущего класса есть объект Loader, который доступен в свойстве $this->load и мы вызываем метод view объекта Loader, передавая ему в качестве параметра строку 'mainview'.

Что касается собственных классов.
Во-первых надо определиться для чего они тебе нужны. Если это контроллер, то создаешь ты его в папке с контроллерами и наследуешь от CI_Controller,
Если тебе нужны классы-помошники, то уже создаешь helper или библиотеку (см liblaries)
Все классы подключаются через $this->load, за исключением указанных в конфиге, они подключаются автоматически.


-----
Удобный сервис для хранения файлов
 
 Top
createl
Отправлено: 16 Декабря, 2012 - 15:50:30
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




Пару дней втыкал в написанное, и кажется, на меня снизошло прозрение(не все еще домыслил, но уже не в тупике). Огромная благодарность тебе, уважаемый Toxa, за трату драгоценного времени на объяснения.
Удалось получить доступ к load в своем классе, наследнике контроллера в папке controllers, прописав простейшую строку parent::__construct(); в классе контроллера и в своем классе. Но, подозреваю, что такое решение не является верным, поскольку функция существует, как мне кажется, для того, чтобы не грузить все классы которые имеются, а делать это выборочно, чтобы снизить нагрузку на систему. А я таким решением, должно быть, ее утроил Радость Поэтому попробую поискать замену своему классу в мануале - наверняка предусмотрели разработчики.
В строке
PHP:
скопировать код в буфер обмена
  1. $this->load =& load_class('Loader', 'core');
не совсем понятен вот этот знак =&. Это, случаем, не фишка php4?
 
 Top
tato
Отправлено: 17 Декабря, 2012 - 09:23:16
Post Id



Посетитель


Покинул форум
Сообщений всего: 468
Дата рег-ции: Сент. 2011  
Откуда: Владивосток


Помог: 8 раз(а)





createl, "функции" которые написанны в теле класса называются методами.


-----
просто ?: сложно
 
 Top
createl
Отправлено: 17 Декабря, 2012 - 13:38:10
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




Критика принята, буду учиться называть вещи своими именами
 
 Top
Toxa
Отправлено: 17 Декабря, 2012 - 13:56:05
Post Id



Посетитель


Покинул форум
Сообщений всего: 352
Дата рег-ции: Окт. 2008  


Помог: 8 раз(а)

[+]


нет нет, насчет parent::__construct() ты все правильно сделал.
Смотри, метод __construct вызывается при создании экземпляра класса, то есть когда создается объект твоего класса, интерпретатор ищет метод __constuct() внутри него. Если такого не обнаружилось, то он вызывает тот же метод родительского класса, то есть CI_Controller'a. Но если ты у себя в классе объявишь __constuct(), то метод родительского класса вызван не будет (потому что ты его переписал), а должен быть. Поэтому во всех контроллерах надо писать

PHP:
скопировать код в буфер обмена
  1. public function __construct()
  2. {
  3.   parent::__construct();
  4. }


На самом деле я тоже начинал изучение фреймворков с CI и тоже охуевал первое время от сложности кода, это нормально. Я помню как читал статьи на хабре по Zend'у и не понимал в нем ни слова.
Для начинающих же CI отличный вариант.


-----
Удобный сервис для хранения файлов
 
 Top
Toxa
Отправлено: 17 Декабря, 2012 - 22:01:43
Post Id



Посетитель


Покинул форум
Сообщений всего: 352
Дата рег-ции: Окт. 2008  


Помог: 8 раз(а)

[+]


createl пишет:
не совсем понятен вот этот знак =&. Это, случаем, не фишка php4?

Это передача значения по ссылке. Здесь нужно смотреть листинг самой функции load_class() в файле core/Common.php
Спойлер (Отобразить)

Дело в том, что CI построен на принципе жосткого сингелтона, это значит, что все классы загружаются лишь единожды и их объекты хранятся в статическом массиве $_classes внутри функции load_class. Ну так вот чтобы сборщик мусора случайно не убил какой-либо из объектов, все они передаются по ссылке. На эту тему масса статей в интернете, скажу лишь, что понимать это не обязательно, можно и без этого освоить фреймворк.


-----
Удобный сервис для хранения файлов
 
 Top
createl
Отправлено: 19 Декабря, 2012 - 23:48:06
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




Toxa пишет:
нет нет, насчет parent::__construct() ты все правильно сделал.

Это даже в мануале написано - при перечитывании заметил))
Вообще хотел написать класс вывода данных из бд для всех контроллеров, чтобы вывод был для всех одинаков за исключением некоторых тонкостей плюс с использованием стандартных решений самого фреймворка и при желании, чтобы можно было изменить(если приспичит) вывод для любого из контроллеров не вмешиваясь в работу дргуих. Собственно можно было и так как я хотел сделать, но модели именно то, что доктор прописал.
Toxa пишет:
Для начинающих же CI отличный вариант

Тоже так подумал, что с более простого начать нужно. Еще поковырял yii, но чет рановато пока.

Столкнулся еще со странным поведением. Когда в контроллере используешь свой метод а не function index(), то шаблон почему отображается без css, хотя путь к нему нормально прописан. Завтра буду пытаться допетрить почему так. Возможно какието нестыковки из за htacess..

Вот еще очень интересующий вопрос. Заметил в CI, что в функции часто приходит разное количество переменных, при ее вызове. Как достигается чтобы она не "ругалась", на случай, если какая то переменная не установлена?

(Отредактировано автором: 19 Декабря, 2012 - 23:49:27)

 
 Top
LIME
Отправлено: 20 Декабря, 2012 - 06:40:19
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




function food($food,$milk=true,$cheese=15){}
food($arr);
food($arr,false);...
 
 Top
createl
Отправлено: 20 Декабря, 2012 - 14:05:09
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




LIME пишет:
function food($food,$milk=true,$cheese=15){}
food($arr);
food($arr,false);...


Ай да я!.. Ха-ха Не знал, что так можно. Спасибо, очень полезная вещь. Как раз нужно применить))
 
 Top
createl
Отправлено: 20 Декабря, 2012 - 18:37:59
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




createl пишет:
Столкнулся еще со странным поведением. Когда в контроллере используешь свой метод а не function index(), то шаблон почему отображается без css, хотя путь к нему нормально прописан. Завтра буду пытаться допетрить почему так. Возможно какието нестыковки из за htacess..

Все просто оказывается. Когда путь вида
CODE (html):
скопировать код в буфер обмена
  1. www.news_localhost.ru/films/roll/1
, то относительный путь, который прописан в метатегах, в шаблоне, теперь тоже вида
CODE (html):
скопировать код в буфер обмена
  1. www.news_localhost.ru/films/roll/css
(самый прикол мозила css к шаблону не прилепляла, но почему то сам css там был доступен, из за чего себе голову сломал - спас хором) . Получается файл css ищется в несуществующей директории. И в файле css ссылки на картинки тоже получаются неправильные по этой причине. Теперь непонятно что делать из за этих человеку понятных урл. Пока только хватило соображаловки на то, чтобы прописать полные пути типа http и тд

(Отредактировано автором: 20 Декабря, 2012 - 18:39:13)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB