Nefunkční OOP kód ve starší verzi PHP

Q

Nefunkční OOP kód ve starší verzi PHP
« kdy: 12. 07. 2018, 07:16:14 »
Snažím se na Raspberry Pi provozovat následující kód, viz. niže. Raspbian vycházející z Debianu 8 - PHP 5.x, nefungovalo. PHP bylo trošku vousaté. Zkusil jsem tedy Raspbian postavený na Debianu 9 - PHP 7.0 a  taky to neběží. Stejná zkušenost nakonec i s VPS s Ubuntu 16.04 - PHP-7. Gentoo - PHP 7.1, OK. VPS s Ubuntu 18.04 - PHP 7.2, OK.
Kód: [Vybrat]
<?php

class A
{
        private 
$BB;

        public function 
__construct()
        {
                
$this->$BB = new B;
                
$this->$BB->PridejPolozku("2");
                
$this->$BB->PridejPolozku("3");
        }
        
        public function 
Prehled()
        {
                
$this->$BB->Generuj();
        }

}

class 
B
{
        private 
$polozky=array();

        public function 
__construct()
        {
            
$this->$polozky[] = "1";
        }

        public function 
PridejPolozku($polozka)
        {
            
$this->$polozky[] = $polozka;
        }   
        public function 
Generuj()
        {
            
            foreach(
$this->$polozky as $polozka)    
                echo(
$polozka."<br>");
        }
}


$AA = new A();
$AA->Prehled();

Chyba:
Kód: [Vybrat]

Notice: Undefined variable: polozky in /var/www/html/test.php on line 27

Fatal error: Uncaught Error: Cannot access empty property in /var/www/html/test.php:27 Stack trace: #0 /var/www/html/test.php(9): B->__construct() #1 /var/www/html/test.php(43): A->__construct() #2 {main} Next Error: Cannot access empty property in /var/www/html/test.php:27 Stack trace: #0 /var/www/html/test.php(9): B->__construct() #1 /var/www/html/test.php(43): A->__construct() #2 {main} thrown in /var/www/html/test.php on line 27

Ok:
Kód: [Vybrat]
1
2
3

Poněkud mě to mate, protože o OOP a PHP čtu docela dlouho. Snažím se dělat nějakou totální prasárnu a PHP >7.1 už je blbuvzdornější, PHP <= 7.0 to prostě neumí, nebo ty verze jsou náhoda a nemám něco doinstalované, odkomentované, ... ?

Díky
« Poslední změna: 12. 07. 2018, 09:01:19 od Petr Krčmář »


t

Re:Nefunkční OOP kód ve starší verzi PHP.
« Odpověď #1 kdy: 12. 07. 2018, 07:36:26 »
V PHP uz dlouho nedelam, ale nemel by jsi pristupovat k promennym tridy takto? $this->polozky misto $this->$polozky ten znak dolaru je tam navic.

Michal Katuščák

Re:Nefunkční OOP kód ve starší verzi PHP.
« Odpověď #2 kdy: 12. 07. 2018, 07:54:29 »
I nové verze ti ty chyby budou vyhazovat. Vyzkoušej například: http://sandbox.onlinephpfunctions.com/
Důvod, proč ti to chyby nevyhazuje může být v tom, že nemáš nastavené vypisování NOTICE.
Jinak skutečně pro přístup v property v třídě se používá: "$this->property" místo "$this->$property"

Kit

Re:Nefunkční OOP kód ve starší verzi PHP.
« Odpověď #3 kdy: 12. 07. 2018, 09:49:27 »
V PHP uz dlouho nedelam, ale nemel by jsi pristupovat k promennym tridy takto? $this->polozky misto $this->$polozky ten znak dolaru je tam navic.

Bingo!

Q

Re:Nefunkční OOP kód ve starší verzi PHP.
« Odpověď #4 kdy: 12. 07. 2018, 17:13:44 »
V PHP uz dlouho nedelam, ale nemel by jsi pristupovat k promennym tridy takto? $this->polozky misto $this->$polozky ten znak dolaru je tam navic.
Dík, to je přesně ono, $ tam nepatřil. Už mi to jede i ve starší verzi.

I nové verze ti ty chyby budou vyhazovat. Vyzkoušej například: http://sandbox.onlinephpfunctions.com/
Důvod, proč ti to chyby nevyhazuje může být v tom, že nemáš nastavené vypisování NOTICE.
Zajímavá adresa, ta se ještě bude hodit. Dík.
Jinak asi máš pravdu. Na jednom z těch VPS běží mailserver a webserver tam je jen kvůli Roundcube. Chybové hlášky na webu nejsou žádoucí, takže vypnuty. U toho Gentoo s PHP 7.1 teď nevím ale pravděpodobně výchozí stav, tedy bez chybových hlášek.



rastik

Re:Nefunkční OOP kód ve starší verzi PHP
« Odpověď #5 kdy: 12. 07. 2018, 20:01:48 »
Nemohlo to fungovat na ziadnej verzii PHP kedze kod nie je validny.
$this->$polozky[] = $polozka; vravi to, ze do atributu s nazvom hodnoty premennej $polozky chces vlozit hodnotu $polozka, ale v triede takyto atribut neexistuje, resp. hodnota premennej $polozky je null, kedze nikde nie je definovana a preto aj to Fatal Error.
Na produkcnych servroch by mali byt chybove hlasenia vypnute, takze preto si nevidel tu chybovu hlasku. Ak by si pozrel do error logu, tak to tam urcite najdes.