2017-03-14 3 views
0

Ich versuche derzeit, einige unserer Websites, die in PHP5 und Smarty 2.6 zu PHP7 und Smarty 3.1.31 waren, zu aktualisieren.variabler Bereich von php5/smarty2.6 zu php7/smarty3.1 migriert

Wir zuvor eine Website mit einem System von Klassen erstrecken andere Klassen hatten, hier ist eine vereinfachte Version davon:

class Site extends WebView 
{ 
    //functions 
} 

class WebView extends LandingPage 
{ 
    //functions 
} 

class LandingPage extends Smarty 
{ 
    function LandingPage() 
    { 
     $this->sessionInit = false; 

     $this->flag = array(); 
     $this->engineVersion = ''; 

     $this->charset = 'utf-8'; 
     $this->content_type = 'text/html'; 
     $this->strings = array(); 
     $this->rtid=null; 
    } 
} 

und vor, dies, dass alle Variablen fein gearbeitet $this->variable_name mit richtig Ort waren . Ich oculd Zugriff sie direkt mit $ this, wie $this->flag['TEST'] aus internen Klassen, oder extern könnte ich $site, wie $site->flag['TEST'] verwenden. Nun aber ich bin immer eine Reihe von nicht definierte Eigenschaft Fehler

Notice: Undefined property: Site::$sessionInit in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447 
Notice: Undefined property: Site::$flag in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447 
Notice: Undefined property: Site::$engineVersion in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447 
Notice: Undefined property: Site::$charset in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447 
Notice: Undefined property: Site::$content_type in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447 
Notice: Undefined property: Site::$strings in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447 
Notice: Undefined property: Site::$rtid in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447 

Ich ging in die Smarty-Klasse (natürlich habe ich das nicht schreiben) und griff sich die Funktion für die Linie 1447, die die generische Setter ist:

/** 
* <<magic>> Generic setter. 
* Calls the appropriate setter function. 
* Issues an E_USER_NOTICE if no valid setter is found. 
* 
* @param string $name property name 
* @param mixed $value parameter passed to setter 
*/ 
public function __set($name, $value) 
{ 
    if (isset($this->accessMap[ $name ])) { 
     $method = 'set' . $this->accessMap[ $name ]; 
     $this->{$method}($value); 
    } elseif (in_array($name, $this->obsoleteProperties)) { 
     return; 
    } else { 
     if (is_object($value) && method_exists($value, $name)) { 
      $this->$name = $value; 
     } else { 
      trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE); 
     } 
    } 
} 

es ist generisch und überall verwendet, so würde ich davon ausgehen, dass in Ordnung ist und das Problem ist, wie ich es nenne. Was mich erreicht, ist, wie sich die Fehler auf Site::$sessionInit beziehen, als ob die Variable Site auf der Site sein müsste, und sie wird verrückt, wenn ich versuche, sie auf der Landingpage zu setzen.

ich weiß, dass der variable bereich einige in php7 geändert hat, ist das sagen mir brauche ich setter für alle meine variablen in der website-klasse? müsste ich für jede Variable einen machen oder würde ein generischer arbeiten? (Es scheint, wie bereits Smarty ein generisches hat, die nicht funktioniert)

+0

Wie die Klasse mit Smarty verwendet wird? Welche Funktionen nennen Sie aus der Smarty-Bibliothek und wie? – m13r

Antwort

0
Notice: Undefined property: Site::$sessionInit in /var/www/html/vendor .... 
.... 
.... 

diese Art von Fehler bedeutet nicht, dass die Variablen aus aus ihm die Bereiche genannt wird.

Dies ist ein Mittel, das Sie versuchen, eine Variable aufzurufen, die zuvor noch nicht definiert wurde.

und diese zu lösen, müssen Sie einfach diese Variablen wie folgt definieren:

class LandingPage extends Smarty 
{ 
    public $sessionInit; 
    public $flag; // or what ever the right visibility term 
    // .... and so on 
    function LandingPage() 
    { 
     $this->sessionInit = false; 

     $this->flag = array(); 
     $this->engineVersion = ''; 

     $this->charset = 'utf-8'; 
     $this->content_type = 'text/html'; 
     $this->strings = array(); 
     $this->rtid=null; 
    } 
} 
+0

Ich werde das ausprobieren. Ist das nur eine Funktion von php5, die sehr verzeihend ist und die Variablen im Namen unserer Anwendungen deklariert, wenn sie diese vorher nicht gefunden hat, während php7 möchte, dass die App sehr explizit ist? – Josh

+0

Ich denke nicht, Sie können diese Hinweise verbergen, indem Sie 'display_errors' in der Datei php.ini auf no setzen – hassan