makeshift_theory Posted December 4, 2006 Share Posted December 4, 2006 Ok, I've recently got addicted to the OOP part of PHP, and I have a question reguarding to the inheirtance featured in PHP. From what I've read you can only extend to one class however if you chain them all of the properties from a ancestor class should be present in the child class. For example:[code]Class example1 { public var $home = "new home"; function __constructor($text) { $this->home = "$test"; }}Class example2 extends example1{ public var $ex2 = "ex2";}Class example3 extends example2{ public var $ex3 = "ex3";}Class example4 extends example3{ function print_stuff() { echo $this->home; echo $this->ex2; echo $this->ex3; return true; }}$ex = new example("This is a test");$ex4 = new example4;$ex4->print_stuff();Result------------------"This is a test" "ex2" "ex3"[/code]Is this about right? If so then I can ask my next question, however I want to make sure my understanding is correct first, thanks. Link to comment https://forums.phpfreaks.com/topic/29402-oop-related-question/ Share on other sites More sharing options...
trq Posted December 4, 2006 Share Posted December 4, 2006 [quote]Is this about right?[/quote]Yes. Link to comment https://forums.phpfreaks.com/topic/29402-oop-related-question/#findComment-134882 Share on other sites More sharing options...
makeshift_theory Posted December 4, 2006 Author Share Posted December 4, 2006 Ok well with that being said, here is the code I have to inquire about:[code]class stats extends login{/* Gathers all stats relevant to character*/ var $int; // Intelligence var $str; // Strength var $agi; // Agility var $wis; // Wisdom var $def; // Defense static $sta; // Stamina var $hp; // HP var $mp; // MP var $clvl; // character level function gather_stats() { // Gathers stats based on the login classes id $this->update_session(); $this->db_query("SELECT * FROM char_stats where c_id = '$this->chosen_char' and a_id = '$this->id'"); // Get specific character information $result = $this->db_readall(); list($blank,$blank,$blank,$this->hp,$this->mp,$this->wis,$this->agi,$this->int,$this->str,$this->def,$this->sta,$this->clvl) = $result; // Assign Results $blank=''; // clear our blank container since list always starts with the 0 iterator $_SESSION['clvl'] = $this->clvl; // Register Character Level return true; } }class draw_items extends stats{ // Draws all needed items to screen. function draw_login() { // Draws Login fields to screen for use $login = "<form action=" . $_SERVER['PHP_SELF'] . " method='POST'>"; $login .= '<table width="45%" cellspacing="0" cellpadding="0" border="0">'; $login .= '<tr>'; $login .= '<td>'; $login .= 'E-mail: '; $login .= '</td>'; $login .= '<td>'; $login .= '<input type="text" name="username">'; $login .= '</td>'; $login .= '</tr>'; $login .= '<tr>'; $login .= '<td>'; $login .= 'Password: '; $login .= '</td>'; $login .= '<td>'; $login .= '<input type="password" name="password">'; $login .= '</td>'; $login .= '</tr>'; $login .= '<tr>'; $login .= '<td align="right" colspan="2">'; $login .= '<input type="submit" value="Login" name="submit">'; $login .= '</td>'; $login .= '</tr>'; $login .= '</form>'; echo $login; return true; }}class char_select extends draw_items{ // Handles the character select menu const total_chars = 3; // Total number of allowed characters var $players_chars; // Number of players characters that he or she currently has var $chosen_char; // Stores chosen characters id function get_char_list() { // This will connect to database get a list of all of the person's characters and display them so the player can choose a character to play with $this->db_query("SELECT * FROM char_table WHERE a_id = '$this->id'"); // This query will find all characters associated with the login account number $this->players_chars = mysql_num_rows($this->queryr); // Assigns number of players characters $this->draw_char_menu(); // Draws the character menu return true; } private function draw_char_menu() { if($_SERVER['REQUEST_METHOD']=='POST') { extract($_POST); foreach($_POST as $k => $v) $key_c = $k; $_SESSION['cid'] = $key_c; // Set Session Character ID $this->chosen_char = $_SESSION['cid']; // Set character id include "js/opengame.js"; // Open and Start Game } else { $char_table = "<form action=". $_SERVER['PHP_SELF'] ." name='charform' method='POST'>"; $char_table .= '<table width="650" cellspacing="0" cellpadding="0" border="0" align="center">'; $char_table .= '<tr>'; while($r = mysql_fetch_array($this->queryr)) { $char_table .= '<td width="200" valign="top">'; $char_table .= '<table width="200" height="400" cellspacing="0" cellpadding="0" border="1" align="center">'; $char_table .= '<tr>'; $char_table .= '<td height="25" valign="middle" align="center">'; $char_table .= $r[4] . " " . $r[3]; $char_table .= '</td>'; $char_table .= '</tr>'; $char_table .= '<tr>'; $char_table .= '<td align="center" valign="middle">'; if($r[5] == "") // If the picture is null then use default $r[5] = "images/portraits/default.jpg"; $char_table .= '<img src="'.$r[5].'" border="0" alt="'.$r[3].'\'s Portrait">'; $char_table .= '</td>'; $char_table .= '</tr>'; $char_table .= '<tr>'; $char_table .= '<td height="25" valign="middle" align="center">'; $char_table .= '<input style="width:200px" type="submit" value="Play This Character" name="'.$r[0].'">'; $char_table .= '</td>'; $char_table .= '</tr>'; $char_table .= ' </table>'; $char_table .= '</td>'; } $char_table .= '</tr>'; $char_table .= '</table>'; $char_table .= "</form>"; echo $char_table; return true; } }}class monster extends char_select{ // Does Monster Related Things var $mint; // Intelligence var $mstr; // Strength var $magi; // Agility var $mwis; // Wisdom var $mdef; // Defense var $msta; // Stamina var $mhp; // HP var $mmp; // MP var $mimg; // M image var $mlvl; //M lvl var $mname; // M Name' var $mdrop; // Monster Drop List var $malive; // If monster is not dead stay to 1 var $mmid; // Monster ID var $mmlvl; // For Storeing Monster Level function get_monster() { // Gets a random monster based on character level $this->update_session(); // Updates Variables $mid = array(); // init array echo $this->clvl; ---->$this->mlvl = rand($this->clvl,2); // Produces a random number between characters lvl + 5 $this->db_query("SELECT * FROM mon_table WHERE mon_lvl = '$this->mlvl'"); // Compiles a list of all same lvl monsters while($r = mysql_fetch_array($this->queryr)) $mid[] = $r[0]; // Compiles a list of all monster Id's $nummonsters = count($mid); // nummonsters is equal to the total number of monsters the query located $randommonster = rand(0,($nummonsters - 1)); // Produces random monster integer if($this->malive == 1) {// Checks for refresh cheat, so they can't switch monsters by hitting refresh $chosen_mon = $this->mmid; $chosen_mlvl = $this->mmlvl; } else { $chosen_mon = $mid[$randommonster]; $chosen_mlvl = $this->mlvl; } $this->db_query("SELECT * FROM mon_table WHERE mon_lvl = '$chosen_mlvl' and mon_id = '".$chosen_mon."'"); // Will produce the random monster $results = $this->db_readall(); list($this->mmid,$this->mlvl,$this->mhp,$this->mmp,$this->mstr,$this->mint,$this->magi,$this->msta,$this->mdef,$this->mname,$this->mimg,$this->mdrop) = $results; // Assign variables $this->malive = 1; // Monster is active NO SWITCHING! and NO REFRESHING WILL SAVE YOU $_SESSION['malive'] = 1; // Set Session Variable $_SESSION['mmid'] = $this->mmid; $_SESSION['mmlvl'] = $this->mlvl; return true; } function draw_monster() { // Ouputs the imagegry for monster $buffer = '<img src="images/monsters/'.$this->mimg.'" alt="'.$this->mname.'" border="0" >'; echo $buffer; }}[/code]I have declared my classes in the page like so:$monster = new monster;$stats = new stats;My question is when I run my page, I do not get a value for $this->clvl in the monster class. Although with inheirtance I should. To fix the problem in the stat class I assign clvl to a Session and then I have a method that updates sessions which is why "$this->update_session(); // Updates Variables" is the first like in the getmonster method. Shouldn't I be able to get the value of $this->clvl without have to store it as a session is my question. Link to comment https://forums.phpfreaks.com/topic/29402-oop-related-question/#findComment-134884 Share on other sites More sharing options...
trq Posted December 4, 2006 Share Posted December 4, 2006 Actually No. I didn't really look at your implimentation.Setting a property on the fly within the construct of example1 will never show up in example4. youve got to rememebr that when you instantiate an object ($obj = new obj()) it is its own instance.So, in your example $ex and $ex4 are two completely different objects.And in fact, when you instantiate a child class, its parents construct is not called automatically. You'd need to call it manually within each child. Link to comment https://forums.phpfreaks.com/topic/29402-oop-related-question/#findComment-134888 Share on other sites More sharing options...
makeshift_theory Posted December 4, 2006 Author Share Posted December 4, 2006 Okay now that makes a lot of sense, so to clarify and correct me if I'm wrong please. Since I stored monster as a new object seperate from stats, monster has no idea what the new stats are. In my program I use $stat->get_stats() so all of the stats get updated however since I'm using $monster as a second instance it has no knowledge of the new stats, is this correct?EDIT: PS> Thanks thorpe for the quick responses, your awesome. Link to comment https://forums.phpfreaks.com/topic/29402-oop-related-question/#findComment-134893 Share on other sites More sharing options...
trq Posted December 4, 2006 Share Posted December 4, 2006 [quote]since I'm using $monster as a second instance it has no knowledge of the new stats, is this correct?[/quote]Yes. That is correct. Link to comment https://forums.phpfreaks.com/topic/29402-oop-related-question/#findComment-134895 Share on other sites More sharing options...
makeshift_theory Posted December 4, 2006 Author Share Posted December 4, 2006 Okay, thanks again for the punctional responses. Link to comment https://forums.phpfreaks.com/topic/29402-oop-related-question/#findComment-134901 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.