免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1914 | 回复: 9
打印 上一主题 下一主题

PHP5类问题--类之间的协调工作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-16 18:50 |只看该作者 |倒序浏览
我写了一个数据库连接类。
db_mysql.php负责连接Mysql数据库。

又写了一个控制member的类,包括首次注册,详细信息注册,包括修改等信息。

父类是
class member
{
        protected $db = null;
        function __construct()
        {
                //在这里创建db类库
                $this->db = new db_mysql();
                //echo $this->db;
        }
        function __destruct()
        {
                $this->db = null;
        }
       
        public function isUsername($username)
        {
                $sql = "select count(*) from member where username='$username'";
                $info = $this->db->query($sql);
                $info = $this->db->fetch($info);
                if($info[0]>0){return true;}else {return false;}
        }
}

class regfirst extends member
{
        protected $db = null;
        private $mem_username;
.....
        function __construct()
        {
                $this->db = new db_mysql();
        }
        function __destruct()
        {
                $this->db = null;
        }
        function setUsername($username)
        {
                $this->mem_username = $username;
                if(!$this->mem_username||trim($this->mem_username)==""){return false;}
                if(parent::isUsername($this->mem_username)==true)
                {
                        echo 'user error.';
                        //return false;
                }
                else
                {
                return true;
                }
                return false;
        }
......
}

这里我使用
$rf = new regfirst();
......
以后我发现mysql_fetch_array(): supplied argument is not a valid MySQL result resource错误。
好像数据库没有正常的工作。。何故?

我修改regfirst类里的__construct函数为
        function __construct()
        {
                parent::__construct();
        }
这样,会重新生成一个连接库,这样不是浪费了DB连接嘛?怎么样实现使用一个db连接库来完成工作?
同样不能工作。
由于PHP5初级,对里面的问题不太清楚,请高手指点一二,有没有相关的材料推荐一下?
应该怎么样让类和类之间协调工作?

论坛徽章:
0
2 [报告]
发表于 2006-12-16 18:58 |只看该作者
我现在用的一个mysql类. 不知你有没有用. 顺便挖坑保存下..



  1. <?php
  2. /**
  3.         require_once("includes/class.mysql.php");
  4.         $db = new Mysql();
  5.         $db->exec($sql);
  6.         while($re = $db->result()) { // 如只返回一条数据则不需要循环
  7.                 print_r($re);
  8.         }
  9. */
  10. class Mysql {
  11.         var $host        = '127.0.0.1';
  12.         var $user        = 'root';
  13.         var $passwd = '';
  14.         var $dbName = '';
  15.        
  16.         var $link, $result;
  17.        
  18.         function Mysql() { // 构造函数,初始化时调用
  19.                 $this->link = mysql_connect($this->host, $this->user, $this->passwd) or die('不能连接到Mysql: ' . mysql_error());
  20.                 mysql_select_db($this->dbName) or die ('不能使用数据库$dbName: ' . mysql_error());
  21.                
  22.                 // 设置PHP连接数据库编码
  23.                 mysql_query("SET NAMES 'utf8'");
  24.         }
  25.         function exec($sql) {
  26.                 $this->result = mysql_query($sql) or die('false'); // 如查讯错误则返回字符串false
  27.                 return $this->result;
  28.         }
  29.         function result() {
  30.                 return @mysql_fetch_assoc($this->result);
  31.         }
  32.         function num() { // 取得结果集中行的数目
  33.                 return mysql_num_rows($this->result);       
  34.         }
  35.         function id() { // 取得上一步 INSERT 操作产生的id
  36.                 return mysql_insert_id();
  37.         }
  38.         function __destruct() { // 析构函数,退出时调用
  39.                 @mysql_free_result($this->result);
  40.                 @mysql_close($this->link);       
  41.         }
  42. }
  43. ?>
复制代码

论坛徽章:
0
3 [报告]
发表于 2006-12-16 20:06 |只看该作者
function __construct()
        {
                parent::__construct();
        }
没什么问题啊
不知道你的“浪费一个db连接”是什么意思。

另外,你可以把数据库类独立出来,类里面 $this->db = &getDb(); 之类

论坛徽章:
0
4 [报告]
发表于 2006-12-16 23:35 |只看该作者
怎样让数据库独立出来?
怎样使用 $this->db = &getDb(); 这样的方法?

论坛徽章:
0
5 [报告]
发表于 2006-12-17 00:24 |只看该作者
[误发,内容见楼下]

[ 本帖最后由 imbiss 于 2006-12-17 00:29 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-12-17 00:27 |只看该作者
创建数据库连接是需要比较大的开销的.
一般使用共享一个数据库连接. 你可以通过一个函数(比如构造函数)把数据库类的引用导入到你的类内的成员属性上.
或者使用global


  1. class yourClass(){
  2.       var $db;
  3.       function yourClass(&$d){
  4.         $this->db=$d;
  5.      }   
  6. }


  7. $db = your_mysql(); //在你的对象外创建数据库对象
  8. $yourObj=new yourClass($db); //把该对象引入你的类内
复制代码

我在php4下用,php5除了构造函数不同,其他应该差不多.

论坛徽章:
0
7 [报告]
发表于 2006-12-17 11:06 |只看该作者
我也是在php4下这样用。
我想PHP5对类的优化,主要体现在哪里?

论坛徽章:
0
8 [报告]
发表于 2006-12-17 11:39 |只看该作者
看手册类把。。。

问题1: 对象设计问题
问题2: 子类和父类间关系理解问题

论坛徽章:
0
9 [报告]
发表于 2006-12-17 11:48 |只看该作者
好,我去看看,有问题再来讨教……谢谢楼上帮助我的人。

论坛徽章:
0
10 [报告]
发表于 2006-12-18 13:16 |只看该作者
属于模式设计的问题,对于数据源这类共用资源,应该用单件模式来设计。
这篇文章里有对这类问题的详细介绍和解答:
http://www.phpit.net/article/using-globals-php/
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP