看板 PHP 關於我們 聯絡資訊
小弟新手,正在實作一個留言板做練習, 練習過程中遇到在物件B中無法呼叫物件A屬性的困擾。 原始碼如下: ---------------------------------- <?php class msg_instance { public $msg_title = "123";//$_POST["msg_title"]; public $msg_body = "456";//$_POST["msg_body"]; public $msg_author = "789";//$_POST["msg_author"]; public $ins_table = "msg_board"; public $sql_str = "insert into msg_board (msg_title, msg_body, msg_author) values ('123','456','789');"; } class c_ins_sql{ public $host = "localhost"; public $db_account = "*******"; public $db_password = "*******"; public $db_id; public $ins_db = "admin001_php2"; function con_db(){ $this->db_id = mysql_connect($this->host,$this->db_account,$this->db_password); mysql_select_db($this->ins_db); } function __construct($sql_str){ if(!is_resource($this->db_id)){ $this->con_db(); echo "建立資料庫連結<br />"; } if(is_resource($this->db_id)){ echo "字串:".$sql_str_var."<br />";//這一行出不來 mysql_query($sql_str_var,$this->db_id); mysql_close($this->db_id); } } } if(isset($_POST["msg_title"]) and isset($_POST["msg_body"])){ $msg_inst = new msg_instance(); echo $msg_inst->sql_str."<br />";//這邊出的來 $sql_str_var = $msg_inst->sql_str; echo "變數宣告的sql字串".$sql_str_var."<br />";//這邊也出的來 $msg_connect = new c_ins_sql($sql_str_var); } ?> --------------------------- 看起來似乎是在物件內, 不能使用其他物件的屬性或外部的變數, 請教板上的前輩, 這樣理解對嗎? 如果要使用其他物件的屬性或外部變數, 該怎麼做呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.26.142
chchwy:OO觀念要加強喔 屬性一定要用$object->var格式來拿 10/19 13:56
這個觀念我知道,我先前試著在$msg_connect裡呼叫$msg_inst的屬性, 寫成$msg_inst->sql_str, 發現無效,所以我特地加了一個變數: $sql_str_var = $msg_inst->sql_str; 發現在$msg_connect裡也無法呼叫$sql_str_var, 才會有物件裡不能呼叫其他物件屬性與外部變數的推測。 ※ 編輯: ibbadmin 來自: 114.32.26.142 (10/19 14:02)
ibbadmin:自己解了,在$msg_connect裡加上Global $sql_str_var 10/19 15:07
gname:這oo看起來有點怪, 用 global 也覺得好怪... 10/19 15:42
LPH66:你已經將那個字串傳進 __construct 裡叫做 $sql_str 了 10/19 15:51
LPH66:在那裡面就請用這個名字找他 10/19 15:51
沒有用,我寫了一行test code,echo都叫不出來, 重新改寫的程式碼如下: <?php $msg_title = $_POST["msg_title"]; $msg_body = $_POST["msg_body"]; $msg_author = $_POST["msg_author"]; $sql_str = "insert into msg_board (msg_title, msg_body, msg_author) values ('".$msg_title."','".$msg_body."','".$msg_author."');"; class c_ins_sql{ public $host = "localhost"; public $db_account = "*****"; public $db_password = "*****"; public $db_id; public $ins_db = "admin001_php2"; function con_db(){ $this->db_id = mysql_connect($this->host,$this->db_account,$this->db_password); mysql_select_db($this->ins_db); } function __construct($sql_str){ echo "test without global:".$sql_str."<br />"; if(!is_resource($this->db_id)){ $this->con_db(); } if(is_resource($this->db_id)){ global $sql_str;//在這個函數裡無法直接使用$sql_str,要先做global宣告才能用 。 echo "test with global:".$sql_str."<br />"; mysql_query($sql_str,$this->db_id); mysql_close($this->db_id); } } } if(isset($_POST["msg_title"]) and isset($_POST["msg_body"])){ //如果留言標題與 内容都存在 $msg_connect = new c_ins_sql($sql_str_var); } $b_id = mysql_connect('localhost','admin001_php','1qaz2wsx3edc'); mysql_select_db('admin001_php2'); $c_id=mysql_query('select * from msg_board',$b_id); $comment=mysql_fetch_array($c_id); ?> 測試結果,宣告global前的echo $sql_str叫不出來,宣告global之後才叫的出來。 ※ 編輯: ibbadmin 來自: 114.32.26.142 (10/19 16:27)
ibbadmin:話說,有沒有地方可以貼程式碼交流啊?貼在板上好花... 10/19 16:29
Fantasywind:echo "字串:".$sql_str."<br />"; 10/19 16:30
Fantasywind:$msg_connect = new c_ins_sql($sql_str_var); 這行 10/19 16:32
Fantasywind:$sql_str_var 這是空值 所以裡面的$sql_str才會空 10/19 16:32
Fantasywind:OO概念你去new他以前 請忽略他的存在XD 10/19 16:33
ibbadmin:I see, 我改改看:) 10/19 16:54
感謝F大,是我debug code沒有整理乾淨。 我把new c_ins_sql($sql_str_var)改為正確的new c_ins_sql($sql_str)後 註解掉global宣告,也能正確傳遞變數進去了:) 感恩,我對把變數傳進物件裡的概念又更清楚了一些。 ※ 編輯: ibbadmin 來自: 114.32.26.142 (10/19 16:59)