[請益] 在一個物件裡如何呼叫另一個物件的屬性?

看板PHP作者 (愛BB)時間14年前 (2011/10/19 13:45), 編輯推噓4(407)
留言11則, 5人參與, 最新討論串1/1
小弟新手,正在實作一個留言板做練習, 練習過程中遇到在物件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

10/19 13:56, , 1F
OO觀念要加強喔 屬性一定要用$object->var格式來拿
10/19 13:56, 1F
這個觀念我知道,我先前試著在$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)

10/19 15:07, , 2F
自己解了,在$msg_connect裡加上Global $sql_str_var
10/19 15:07, 2F

10/19 15:42, , 3F
這oo看起來有點怪, 用 global 也覺得好怪...
10/19 15:42, 3F

10/19 15:51, , 4F
你已經將那個字串傳進 __construct 裡叫做 $sql_str 了
10/19 15:51, 4F

10/19 15:51, , 5F
在那裡面就請用這個名字找他
10/19 15:51, 5F
沒有用,我寫了一行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)

10/19 16:29, , 6F
話說,有沒有地方可以貼程式碼交流啊?貼在板上好花...
10/19 16:29, 6F

10/19 16:30, , 7F
echo "字串:".$sql_str."<br />";
10/19 16:30, 7F

10/19 16:32, , 8F
$msg_connect = new c_ins_sql($sql_str_var); 這行
10/19 16:32, 8F

10/19 16:32, , 9F
$sql_str_var 這是空值 所以裡面的$sql_str才會空
10/19 16:32, 9F

10/19 16:33, , 10F
OO概念你去new他以前 請忽略他的存在XD
10/19 16:33, 10F

10/19 16:54, , 11F
I see, 我改改看:)
10/19 16:54, 11F
感謝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)
文章代碼(AID): #1EdcFvRT (PHP)
文章代碼(AID): #1EdcFvRT (PHP)