作者ibbadmin (爱BB)
看板PHP
标题[请益] 在一个物件里如何呼叫另一个物件的属性?
时间Wed Oct 19 13:45:25 2011
小弟新手,正在实作一个留言板做练习,
练习过程中遇到在物件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
1F:推 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)
2F:→ ibbadmin:自己解了,在$msg_connect里加上Global $sql_str_var 10/19 15:07
3F:→ gname:这oo看起来有点怪, 用 global 也觉得好怪... 10/19 15:42
4F:推 LPH66:你已经将那个字串传进 __construct 里叫做 $sql_str 了 10/19 15:51
5F:→ 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)
6F:→ ibbadmin:话说,有没有地方可以贴程式码交流啊?贴在板上好花... 10/19 16:29
7F:推 Fantasywind:echo "字串:".$sql_str."<br />"; 10/19 16:30
8F:推 Fantasywind:$msg_connect = new c_ins_sql($sql_str_var); 这行 10/19 16:32
9F:→ Fantasywind:$sql_str_var 这是空值 所以里面的$sql_str才会空 10/19 16:32
10F:→ Fantasywind:OO概念你去new他以前 请忽略他的存在XD 10/19 16:33
11F:→ 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)