Невозможно создать экземпляр объекта внутри PHP-heredoc в common.php (и / или $ this находится вне контекста объекта !!) - PullRequest
0 голосов
/ 13 марта 2012

Мое веб-приложение должно позволять пользователю вводить шестнадцатеричные значения для цвета метки, фона и цвета шрифта. Мне нужно иметь возможность обновлять цвет фона, цвет метки и цвет шрифта в зависимости от шестнадцатеричных значений, которыепользовательские входы, которые сохраняются в таблице MySQL.Моя цель - извлечь значения шестнадцатеричных цветов из базы данных в начале файла common.php (который является моим css) и назначить их трем цветным переменным ($ clabel, $ cbackground и $ cfont) и использовать их внутри моего css, так чточто все изменения цвета находятся в одном месте.Но я сталкиваюсь с некоторыми проблемами, и корень всех проблем в том, что $ this не находится в контексте объекта внутри common.php - - - Мне было интересно, что я делаю, чтобы добиться того же результата в будущем.(Я также хочу упомянуть здесь, что я попытался включить класс и создать экземпляр объекта этого класса внутри common.php. Он не работает, и вся моя веб-страница теряет все свое форматирование, определенное в commom.php)

Сценарий 1:

<?php header("Content-type: text/css");
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("shiprequ_sr", $con);

$userid = $this->user->id;

$resultUser = mysql_query("SELECT * FROM users Where Id=$userid");

while($row = mysql_fetch_array($resultUser,MYSQL_NUM))
  {
    $templateId =$row[15];  
  }

$resultTemplates = mysql_query("SELECT * FROM templates Where Id=$templateId"); 

while($row = mysql_fetch_array($resultTemplates,MYSQL_NUM))
  {
            $clabel = '#'.$row[14];
    $cbackground = '#'.$row[13];    
    $cfont = '#'.$row[16];

 } 
mysql_close($con); 

?>

<style type='text/css'>
.text4                          
{
color: <?=$clabel?>;// font and bkg colors are referred to likewise  
}

Приведенный выше код работает только тогда, когда $ userid = $ this-> user-> id;заменяется определенным идентификатором пользователя, например $ userid = 101;По какой-то причине $ это не доступно в common.php.

Сценарий: 2

<?php header("Content-type: text/css");

include('C:/sr/application/models/getdata.php');
$clabel = getLabelColor(); 
$cbackground = getBkgColor(); 
$cfont = getFontColor(); 
 ?>

<style type='text/css'>
.text4                          
{
color: <?=$clabel?>;// font and bkg colors are referred to likewise  
}
</style>

getdata.php выглядит следующим образом:

function getLabelColor() { 


$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("shiprequ_sr", $con);

$userid = $this->user->id;

$resultUser = mysql_query("SELECT * FROM users Where Id=$userid");

while($row = mysql_fetch_array($resultUser,MYSQL_NUM))
  {
    $templateId =$row[15];  
  }

$resultTemplates = mysql_query("SELECT * FROM templates Where Id=$templateId"); 

while($row = mysql_fetch_array($resultTemplates,MYSQL_NUM))
  {

    $clabel = '#'.$row[14];

  } 
 mysql_close($con); 

return $clabel;
}

//getFontColor() and getBkgColor() defined likewise

Этот код портит всю веб-страницу, как будто CSS не существует.

Когда я использую тот же код из layout.phtml (в качестве теста):

<!--In layout.phtml-->
<?php
include('C:/sr/application/models/getdata.php');
echo $clabel = getLabelColor(); //purple 51:0:153
echo $cbackground = getBkgColor(); //Light blue 102:102:204
echo $cfont = getFontColor();
?>

Я получаю следующую ошибку:

Fatal error: Using $this when not in object context in C:\sr\application\models\getdata.php on line 14

Мне интересно, почему$ это не в контексте объекта, как оно используется в моем коде или как его можно поместить в контекст объекта?

Ответы [ 2 ]

0 голосов
/ 17 марта 2012

Как вы определили, проблема в строке кода:

$userid = $this->user->id;

Причиной возникновения проблемы с этим кодом является то, что $this - это специальная переменная, которая действительна только в контексте метода класса.

common.php является процедурным файлом и не имеет определенного класса, поэтому $this не находится внутри объекта, поэтому вы получаете сообщение об ошибке.

Предполагая, что вы используете Zend_Auth, вы можете изменить эту строку на:

$userid = Zend_Auth::getInstance()->getIdentity()->id;

Однако в контексте приложения Zend Framework common.php - это не тот код, который вы ожидаете увидеть. Скорее, вам следует перенести функциональность на набор контроллеров, моделей и скриптов представления.

0 голосов
/ 13 марта 2012

Вы можете использовать $ this только в классе, например

class TestClass {
    private $name = "Name";
    public function echoName() {
        echo $this->name; // use $this only inside class
    }
}

Если у вас есть объект $ user в качестве глобальной переменной, то вам нужно добавить

global $user;

в качестве первой строкивашей функции getLabelColor () и затем используйте ее следующим образом:

$userid = $user->id;

Подробнее о Классы и объекты в php

...