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
Форумы портала PHP.SU :: Версия для печати :: Классы в PHP
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Классы в PHP

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

1. Eazy-E - 05 Октября, 2011 - 15:40:44 - перейти к сообщению
Здравствуйте уважаемы форумчане! Пытаюсь научиться ООП, пишу класс шаблонизатора.
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class BuildTemplate
  3. {
  4. var $template;
  5.  
  6.         function LoadTpl(){
  7.         $tpl = file_get_contents (ROOT_DIR . '/theme/main.tpl');
  8.         require_once CORE_DIR . '/settings/site.php';
  9.         }
  10.         function ParseTpl(){
  11.         $tpl = str_replace ('{header}', $header, $tpl);
  12.         print $tpl;
  13.         }
  14.        
  15. }
  16.  
  17. BuildTemplate::LoadTpl();
  18. BuildTemplate::ParseTpl();
  19. ?>


Вот эта хрень не работает! =( Люди добрые, объясните идиоту! Где ошибка?! В самом начале класса объявлен объект template, как его использовать в моем примере?! Простите за тупые вопросы, не могу понять что к чему... спасибо за помощь!
2. LIME - 05 Октября, 2011 - 16:12:41 - перейти к сообщению
Eazy-E пишет:
BuildTemplate::LoadTpl();
BuildTemplate::ParseTpl();
так обращаются к статическим методам (в контексте класса)
BuildTemplate->LoadTpl();
BuildTemplate->ParseTpl();
3. OrmaJever - 05 Октября, 2011 - 16:19:43 - перейти к сообщению
LIME только вначале нужно создать обьект.
Eazy-E вам бы прочитать всё сначала http://php.su/learnphp/phpoo/
4. Eazy-E - 05 Октября, 2011 - 16:26:53 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $obj = new BuildTemplate;
  2. BuildTemplate->LoadTpl();
  3. BuildTemplate->ParseTpl();


Пробовал я вот так, ничего не вышло. Как обычно пустое окно.. Читал я про ооп, не могу понять.. Объясните на моем примере пожалуйста, думаю только так до меня дойдет Огорчение Как в моем случае использовать объект $template, и нужно ли? Заранее спасибо
5. OrmaJever - 05 Октября, 2011 - 16:28:29 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $obj = new BuildTemplate;
  2. $obj->LoadTpl();
  3. $obj->ParseTpl();
6. Eazy-E - 05 Октября, 2011 - 16:36:02 - перейти к сообщению
OrmaJever пишет:
$obj = new BuildTemplate;
$obj->LoadTpl();
$obj->ParseTpl();


Извинияюсь, вот это я и хотел написать.. Ладно, бог с ним.. Сам попробую докопаться.
7. caballero - 05 Октября, 2011 - 16:56:46 - перейти к сообщению
А что будет если ктото вызовет сначала parse?

впрочем код и так не рабочий
переменная $tpl в метода parse никак не связана с переменной в методе load


function ParseTpl(){
$tpl = $this->LoadTpl()
$tpl = str_replace ('{header}', $header, $tpl);
print $tpl;
}

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

<?PHP
class BuildTemplate
{
private $tpl;

function LoadTpl(){
$this->tpl = file_get_contents (ROOT_DIR . '/theme/main.tpl');
require_once CORE_DIR . '/settings/site.php';
}
function ParseTpl(){
$this->tpl = str_replace ('{header}', $header, $this->tpl);
print $this->tpl;
}

}

BuildTemplate::LoadTpl();
BuildTemplate::ParseTpl();
?>
8. Eazy-E - 05 Октября, 2011 - 18:44:12 - перейти к сообщению
Да уж, не думал что проблема окажется столь серьезной.. caballero, увы ничего не работает.. Я в принципе и сам догадывался, что в методе Parse нужно обратиться к методу Load.. но как?! Вот в чем вопрос. Стоит заметить, что если преобразовать эти две функции в одну (LoadTpl), то все работает на ура. Только мне от такого метода толку - ноль. Будут ли еще предложения?

Edit:

caballero, во втором листинге вылазит ошибка:

Цитата:
Fatal error: Using $this when not in object context in .... on line 7
9. caballero - 05 Октября, 2011 - 19:14:14 - перейти к сообщению
наверно как статику вызываете
BuildTemplate::LoadTpl();
BuildTemplate::ParseTpl();

вызывайте как методы объекта

$obj = new BuildTemplate;
$obj->LoadTpl();
$obj->ParseTpl();
10. Eazy-E - 05 Октября, 2011 - 19:35:44 - перейти к сообщению
Пробовал, не помогает.. Где ошибка, понять не могу..
11. caballero - 05 Октября, 2011 - 19:47:09 - перейти к сообщению
скопируйте строку где ошибка
12. Eazy-E - 05 Октября, 2011 - 19:56:14 - перейти к сообщению
Выводит пустое окно в браузере. Экранирование ошибок включено. В чем может быть проблема?
13. Bio man - 05 Октября, 2011 - 20:17:26 - перейти к сообщению
сперва отладь каждый член, каждую переменную var_dump()'ом. тогда станет понятней где что не так
(Добавление)
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class BuildTemplate
  3. {
  4. private $tpl;
  5.  
  6. function LoadTpl(){
  7. $this->tpl = file_get_contents (ROOT_DIR . '/theme/main.tpl');
  8. echo '<pre>';
  9. var_dump($this->tpl);
  10. echo '</pre>';
  11. require_once CORE_DIR . '/settings/site.php';
  12. }
  13. function ParseTpl(){
  14. $this->tpl = str_replace ('{header}', $header, $this->tpl);
  15. echo '<pre>';
  16. var_dump($this->tpl);
  17. var_dump($header);
  18. echo '</pre>';
  19. print $this->tpl;
  20. }
  21.  
  22. }
  23. $tpl = new BuildTemplate();
  24. $tpl->LoadTpl();
  25. $tpl->ParseTpl();
  26. echo '<pre>';
  27. var_dump($tpl);
  28. echo '</pre>';
  29. ?>

как то так
14. Eazy-E - 05 Октября, 2011 - 20:27:46 - перейти к сообщению
да тут и без отладки все ясно было Улыбка

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. string(8) "{header}" //Из метода LoadTpl
  3. string(0) "" //Из метода ParseTpl
  4.  


Что говорит о том, что значение не передается...

Главный вопрос - как передать значение переменной из первого метода второму? Собственно и все.
(Добавление)
Bio man, тоже самое вашим методом:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. string(8) "{header}"
  3.  
  4. string(0) ""
  5. NULL
  6.  
  7. object(BuildTemplate)#1 (1) {
  8.  ["tpl":"BuildTemplate":private]=>
  9.   string(0) ""
  10. }
  11.  


Нифига не пойму, куда пропадает значение?!
15. Bio man - 05 Октября, 2011 - 20:31:34 - перейти к сообщению
Eazy-E пишет:
да тут и без отладки все ясно было Улыбка

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. string(8) "{header}" //Из метода LoadTpl
  3. string(0) "" //Из метода ParseTpl
  4.  


Что говорит о том, что значение не передается...

Главный вопрос - как передать значение переменной из первого метода второму? Собственно и все.
какую переменную? $tpl?
(Добавление)
файл шаблона кинь
(Добавление)
откуда $heder берешь? если он вне класса то нужно его передать методу либо написать global $header если он вне класса
(Добавление)
походу ясно в чем проблема. {header} заменяется пустой строкой так как $header не обьявлена

 

Powered by ExBB FM 1.0 RC1