php实例化多个类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php实例化多个类相关的知识,希望对你有一定的参考价值。

$db = new user($serverName,$uid,$pwd,$database,$CharacterSet);
mssql.class.php
user.class.php
node.class.php (这个类本来在user.class.php中,可是user.class.php
太长了)
.....
我一直很困惑,把所有的方法都写到一个类中,实例化后调用没有问题,但是那样类太长,我想把一个大类拆分成多个小类,但是实例化又出现问题,想问问各位达人此类问题应该怎样处理。

给你举个例子吧:
比如说:现在有user.class.php
mysql.class.php
现在用户类有注册、登录等一系列的操作(要使用数据库类)
我们直接在user.class.php 中把数据库类给实力化了
这样就了可以达到你的那个效果了;
千万不要在将所有的方法放在一个类中,这样是不好做法,住好是一个类只对于他本身的方法;这样做的目的是让逻辑更加清晰,和降低服务器的资源消耗。追问

我有个地方不清楚,就是我要拆分成很多类,每个类都要实例化(数据库类),那我在
user.class.php中要怎样实现,例如下面的代码,我要在哪里实例化数据库类?

追答

直接引入文件
采用new或是构造方法,就可以

参考技术A 对于PHP来说一个类几千行的确使其程序可读性非常差。你可以把各种不同功能的类拆分开来,然后用include或者require函数把类包含进去就可以了,例如:DB类为一个类,里面有各种DB方法,USER类为一个类里面是对user的一些操作方法,然后你把这两个类包含进同一个PHP文件里面,里面不是同时有db类跟user类的方法了吗?这时把两个类实例化了之后就跟使用一个类一样了,如果你嫌麻烦一个一个包含进去的话,可以用function __autoload()这个魔术方法去加载,如果还嫌长或者麻烦,建议你了解下MVC的开发思想了。追问

include_once ("common/mssql.class.php");
include_once ("configs/mssql.php");
include_once ("common/user.class.php");
include_once ("common/node.class.php");
$db = new user($serverName,$uid,$pwd,$database,$CharacterSet);
我是想这么做,但是遇到了一个问题,那就是必须要new这个类才能使用,user类和node类都继承了mssql类,不知道实例化这儿要怎么处理。

追答

如果是我,我会用function __autoload()这个方法去处理,建议你去了解下 __autoload()这个魔术方法,自动加载类然后自动实例化。PHP手册对这个方法有详细介绍,你仔细看完就能弄明白了,如果还不明白我写个例子给你看吧

追问

好的,我先试试

参考技术B 你拆开之后有问题,估计是因为之前的类内部方法之间互有调用,你得先看懂这个类中方法的一些关系,再做开分!追问

拆分的两个类都继承了mssql类(DB类),你说的类在哪里?

参考技术C 如果能处理成一个类就用一个类呗,长点有什么关系,调用不出问题就行了,为什么要拆分啊追问

要几千行啊!就是感觉太长了!!调用是没什么问题!

追答

一个类几千行是很正常的好不好,

PHP设计模式之单例模式

 

定义:

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

 

实现思路:

1、通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

2、首先从强制控制对象实例化开始,创建一个无法从外部进行实例化的类,这听起来似乎很难,但其实只需要简单地将构造方法定义为 private 即可。

3、因为构造方法是私有的,所以可以用一个静态方法 $getInstance() 和一个静态属性 $instance 来间接地实例化对象

4、$instance 属性定义为静态私有的,因此我们无法从类的外部访问它, getInstance() 方法定义为静态 public 的,所以脚本中的任何代码都可以调用它。

 

代码实例:

class Single
{
    /**
     * 定义一个静态私有的属性存储实例化对象
     */
    private static $instance;
 
    /**
     * Single constructor. 构造方法 private,防止外部 new创建此类实例
     */
    private function __construct()
    {
    }
 
    /**
     * 定义一个静态 public方法,这是获取本类实例的唯一全局访问点
     */
    public static function getInstance()
    {
        // 判断是否存在已有实例,不存在则new一个新实例,确保只有一个实例
        if (empty(self::$instance)) {
            self::$instance = new Single();
        }
        return self::$instance;
    }
}

 

以上是关于php实例化多个类的主要内容,如果未能解决你的问题,请参考以下文章

php类实例化问题

php类实例化

PHP在单例模式中,是多个线程只有一个实例还是一个线程只有一个实例

php 实例化 问题

PHP能在类中实例化一个类吗

PHP设计模式之单例模式