Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: __get nie działa
Forum PHP.pl > Forum > PHP
foxbond
Przyklad w pełni zgodny z oryginałem

  1.  
  2. <?php
  3. class klasa1 {
  4.  
  5. public $playerInfo = array();
  6.  
  7. public function __get ($name){
  8. echo "get:".$name;
  9. if (array_key_exists($name, $this->playerInfo)){
  10. return $this->playerInfo[$name];
  11. }
  12. return null;
  13.  
  14. }
  15.  
  16. public function __construct (){
  17. $this->playerInfo = array("var"=>"11");
  18. }
  19.  
  20. }
  21.  
  22. class klasa2 {
  23.  
  24. public $player;
  25.  
  26. public function __construct ($player){
  27. $this->player = $player;
  28. }
  29.  
  30. public function funkcja (){
  31.  
  32. return $this->player->var;
  33.  
  34. }
  35.  
  36. }
  37.  
  38. $kl1 = new klasa1();
  39.  
  40. $kl2 = new klasa2($kl1);
  41.  
  42. var_dump($kl2->funkcja());
  43.  
  44. ?>
  45.  


php 5.3

Var_dump zwraca null

0 błędów jakiegokolwiek typu
sowiq
"U mnie działa!"

A tak serio - jesteś pewien, że uruchamiasz dokładnie ten sam plik, który edytujesz? Bo ten kod wygląda w porządku, a dodatkowo uruchomiłem go u siebie i w wyniku dostałem:
Kod
get:varstring(2) "11"
foxbond
NO tak ten kod też mi działa, a oryginał nie....

  1. //player.class.php
  2. <?php
  3. class player extends blEngineModule {
  4.  
  5.  
  6. public $playerInfo = array();
  7.  
  8. public function __get ($name){
  9. echo "get:".$name;
  10. if (array_key_exists($name, $this->playerInfo)){
  11. return $this->playerInfo[$name];
  12. }
  13. return null;
  14.  
  15. }
  16.  
  17. public function __construct (&$db){
  18.  
  19. $this->db = $db;
  20.  
  21.  
  22.  
  23.  
  24. }
  25. ?>
  26. //dialog.class.php
  27. <?php
  28. class dialog extends blEngineModule {
  29.  
  30. public $db;
  31.  
  32. public $dialog = array();
  33.  
  34. public function __construct (&$param1 ){
  35.  
  36. if (is_array($param1)){
  37. $this->dialog = $param1;
  38. }else{
  39. $this->db = $param1;
  40. }
  41. }
  42.  
  43.  
  44. public function loadDialog ($dialogId){
  45. //na razie z pliku
  46. $t = file_get_contents("temp/scriptmy/test.bles");
  47. $this->dialog = json_decode($t, true);
  48. }
  49.  
  50.  
  51. public function selectBranch ($deep=null){
  52. $deep = $this->parseDeepInfo($deep);
  53.  
  54. if ($deep === false){
  55. $branch = $this->dialog;
  56. }else{
  57. $c = count ($deep);
  58. for ($i=0;$i<$c;$i++){
  59. $branch = $this->dialog[$deep[$i]];
  60. }
  61. }
  62.  
  63. //$this->branch = $branch;
  64. return new dialog($branch);
  65. }
  66.  
  67. public function parseDeepInfo($deepInfo=null) {
  68. if (!empty($deepInfo)){
  69. //rozbic po .
  70. return explode(".", $deepInfo);
  71.  
  72. }else{
  73. return false;
  74. }
  75.  
  76. }
  77.  
  78. public function lastPlayerResponse (){
  79. if (!empty($this->dialog['name'])){
  80. return $this->dialog['name'];
  81. }else{
  82. return false;
  83. }
  84.  
  85. }
  86.  
  87. public function lastNPCResponse (){
  88. return $this->dialog['response'];
  89. }
  90.  
  91. public function playerResponses ($player){
  92. $c = count($this->dialog);
  93. //die($player->playerlevel);
  94. $responses = array();
  95. for ($i=0;$i<$c;$i++){
  96. if (array_key_exists($i, $this->dialog)){
  97. $act = empty($this->dialog[$i]['action']) ? false : $this->dialog[$i]['action'];
  98. //spr warunki danej opcji dialogu
  99. $can = true; //może przerwac break; lub jak pętla to ust. to na false
  100. if (!empty($this->dialog[$i]['request'])){
  101. $req = $this->dialog[$i]['request'];
  102. if (!empty($req['player'])){
  103. //odnosnie gracza
  104. if (!empty($req['player']['levelMin'])){
  105. if (($req['player']['levelMin']) > $player->playerlevel){
  106. echo "levelmin";
  107. var_dump($req['player']['levelMin']);
  108. var_dump($player->playerlevel);
  109. var_dump($player);
  110.  
  111. continue;
  112. }
  113. }
  114.  
  115. if(!empty($req['player']['levelMax'])){
  116. if ($req['player']['levelMax'] <= $player->playerLevel){
  117. echo "levelmax";
  118. continue;
  119. }
  120. }
  121.  
  122. if(!empty($req['player']['class'])){
  123. if ($req['player']['class'] != $player->playerClass){
  124. echo "class";
  125. continue;
  126. }
  127. }
  128. /*
  129. if ($req['player'][''] != {x}){
  130.  
  131. }
  132. */
  133. }
  134.  
  135. if (!empty($req['eq'])){
  136. //itemki TYLKO W EQ
  137.  
  138. if (array_key_exists('one', $req['eq'])){
  139. //jedna z danych rzeczy
  140. $c = count($req['eq']['one']);
  141. $can = false;
  142. for ($i=0;$i<$c;$i++){
  143. if ($player->haveItem($req['eq']['one'][$i])){
  144. $can = true;
  145. }
  146. }
  147. }
  148.  
  149. if (array_key_exists('all', $req['eq'])){
  150. //wszystkie z danych rzeczy
  151. $c = count($req['eq']['all']);
  152. $can = true;
  153. for ($i=0;$i<$c;$i++){
  154. if (!($player->haveItem($req['eq']['one'][$i]))){
  155. $can = false;
  156. }
  157. }
  158. }
  159.  
  160. if (($req['eq'] !== 0) && ($req['eq'] !== 1)){
  161. //tylko jeden item
  162. $can = $player->haveItem($req['eq']);
  163. }
  164.  
  165. }
  166.  
  167. }
  168.  
  169. if ($can){
  170. $responses[] = array("name"=>$this->dialog[$i]['name'], "action"=>$act);
  171. }
  172.  
  173. }
  174. }//end for -> all dialog
  175.  
  176.  
  177. return $responses;
  178. }
  179.  
  180. }
  181. ?>
  182.  
  183. //i ostatni
  184. //test.php
  185. <?php
  186.  
  187. require_once("core.php");
  188.  
  189. $db = new dbSystem($dbcfg);
  190.  
  191. $dialog = new dialog($db);
  192.  
  193. $dialog->loadDialog(1);
  194.  
  195. //if fail
  196. //var_dump($dialog);
  197. $deep = empty($_GET['deep']) ? null : $_GET['deep'];
  198. $branch = $dialog->selectBranch($deep);
  199. //var_dump($branch);
  200. echo $branch->lastNPCResponse();
  201.  
  202. $player = new player($db);
  203. $player->loadPlayerData(1);
  204. //var_dump("lol", $player->playerLevel);
  205. var_dump($branch->playerResponses($player));
  206. ?>



NET mi rozłączył i zżarło połowę posta, myslę, że forum powinno jakoś zapobiegać takim wypadkom (tj. w ogóle nie publikowac postu)


Dobra już poprawiłem. Jak widac to jest zależne od kilku innych plików, jednak ZAPEWNIAM, że nie ma w nich błędu.

Męczę się z tym i wciąż nie widzę błędu. Na prawdę nikt nie może pomóc?
netmare
zrób w __get var_dump($this->playerInfo), jeśli w ogóle wchodzi w __get bo nie rzuca mi się w oko powód dla którego miałby tam wejść to ciekawe co jest w tablicy.
foxbond
Dane na początku funkcji playerResponses
  1. var_dump($player);
  2.  
  3. var_dump($player->playerLevel);


zwraca poprawne wyniki

JEDNAK kilka linijek dalej "$player->playerLevel" zwraca null. Nie widzę tutaj żadnego błędu, może jakaś literówka i ja jej nie dostrzegam?



Tutaj jeszcze raz zmieniona funkcja playerResponses:
Kod
public function playerResponses ($player){
        $c = count($this->dialog);
        
        //var_dump($player);
        
        var_dump("-->", $player->playerLevel, "<--");//zwraca 11
        echo "\r\n\r\n";
        $responses = array();
        for ($i=0;$i<$c;$i++){
            if (array_key_exists($i, $this->dialog)){
                $act = empty($this->dialog[$i]['action']) ? false : $this->dialog[$i]['action'];
                //spr warunki danej opcji dialogu
                $can = true; //może przerwac break; lub jak pętla to ust. to na false
                if (!empty($this->dialog[$i]['request'])){
                    $req = $this->dialog[$i]['request'];
                    if (!empty($req['player'])){
                        //odnosnie gracza
                        if (!empty($req['player']['levelMin'])){
                            var_dump("->", $player->playerlevel, "<-");//zwraca NULL
                            if (($req['player']['levelMin']) > $player->playerlevel){
                                echo "levelmin";
                                var_dump($req['player']['levelMin']);
                                var_dump($player->playerlevel);
                                var_dump($player);
                                
                                continue;
                            }
                        }
                        
                        if(!empty($req['player']['levelMax'])){
                            if ($req['player']['levelMax'] <= $player->playerLevel){
                                echo "levelmax";
                                continue;
                            }
                        }
                        
                        if(!empty($req['player']['class'])){
                            if ($req['player']['class'] != $player->playerClass){
                                echo "class";
                                continue;
                            }
                        }
                        /*
                        if ($req['player'][''] != {x}){
                            
                        }
                        */
                    }
                    
                    if (!empty($req['eq'])){
                        //itemki TYLKO W EQ
                        
                        if (array_key_exists('one', $req['eq'])){
                            //jedna z danych rzeczy
                            $c = count($req['eq']['one']);
                            $can = false;
                            for ($i=0;$i<$c;$i++){
                                if ($player->haveItem($req['eq']['one'][$i])){
                                    $can = true;
                                }
                            }
                        }
                        
                        if (array_key_exists('all', $req['eq'])){
                            //wszystkie z danych rzeczy
                            $c = count($req['eq']['all']);
                            $can = true;
                            for ($i=0;$i<$c;$i++){
                                if (!($player->haveItem($req['eq']['one'][$i]))){
                                    $can = false;
                                }
                            }
                        }
                        
                        if (($req['eq'] !== 0) && ($req['eq'] !== 1)){
                            //tylko jeden item
                            $can = $player->haveItem($req['eq']);
                        }
                        
                    }//to wszystko copy kilka linijek wczesniej
                    
                }
                
                if ($can){
                    $responses[] = array("name"=>$this->dialog[$i]['name'], "action"=>$act);
                }
                
            }
        }//end for -> all dialog
        
        
        return $responses;
    }


Znalazłem błąd, ALE dopiero po wklejeniu na forum.

Eclipse for PHP Developers, win 7

Nic nie zmieniane w ustawieniach

L wygląda identycznie jak l

Czyli problemem była literówka

W każdym razie dziękuję za pomoc
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.