父类: user
子类:
Shared user
Orign user
希望用父类生成objet
然后父类有一个函数来确定使用的子类
用此objet 来直接调用子类的函数不知道有没有办法可以实现.因为所有的页面都调用一个类来生成object,可现在这个object有两种情况了,我也不可能每一页都改,所以就希望写一个空的父类,在这个父类里添加一个判断函数,然后把两种情况写成两个子类,通过条件来判定到底使用哪一个,这样,我就不用更改原来的页面。

解决方案 »

  1.   

    也就是说Shared user,Orign user两个子类继承user父类,程序还是new user(),然后根据条件判断new shared() or Orign()这样凭第一感觉不行唉.要不你判断条件在父类外还是可行的~~
      

  2.   

    恩,就是楼上所说的意思,我也觉得好像不行,但是几百个页面啊,改起来很麻烦啊,这该死的每个页面都copy这个函数,每个页面都进行认证,所以每个页面都得改。
      

  3.   

    写成一个php文件
    用到的地方include就行了。
      

  4.   

    <?phpclass p
    {
    public function into()
    {
    $d = get_class($this);

    switch($d) {
    default:
    return a::callback();
    break;

    case "b":
    return b::callback();
    break;
    }
    }
    };
    class a extends p
    {
    public static function callback() {
    return "class a 'callback' method<br />";
    }
    };
    class b extends p
    {
    public static function callback() {
    return "class b 'callback' method<br />";
    }
    };
    $a = new a();
    $b = new b();echo $a->into();echo $b->into();?>
    我绕了一个弯,实现了这个功能。不知道是不是楼主想实现的功能?
      

  5.   

    感谢yagas,可能我没有说清楚
    应该是这样的:
    每一个页面都有这样一个函数:
    $p=new p();
    $p->init();
    $p->doSomething();在class里面呢,我希望是这样的,当然这样不行,
    class p {public function p()
    {
      if ($_SESSION["class"]=="a")
         return new a();
      else if ($_SESSION["class"]=="b")
         return new b();
    }
    }
    }
    class a{
      public function init(){
       echo "in a";
    }
    }
    class b{
      public function init(){
      echo "in b";
    }
    }
    这样我只需要改$_SESSION["class"]的内容就可以让他们使用不同的class,但显然,这样做是不肯能的。
    我想问问呢有没有什么办法能绕过去。
      

  6.   

    问题就在于一开始你没有把需求说清楚,否则早就解决了考虑到你每页都有
    $p=new p(); 
    $p->init(); 
    这很关键!下面是测试代码
    <?php
    class A {
      function init() {
        echo __CLASS__;
      }
    }
    class B {
      function init() {
        echo __CLASS__;
      }
    }
    class P {
      function init() {
        foreach($GLOBALS as $k=>$v) {
          if(is_object($v) && get_class($v) == 'P') {
    $GLOBALS[$k] = new $_SESSION['class'];
    $GLOBALS[$k]->init();
           break;
          }
        }
      }
    }
    $_SESSION['class'] = 'a';
    $p = new p;
    $p->init(); // A$_SESSION['class'] = 'b';
    $x = new p;
    $x->init(); // B
    ?>
      

  7.   

    楼主说的完全就是工厂模式
    下面是代码<?php
    //抽象基类User
    abstract class User 
    {
        protected $name = NULL;
        //构造函数
        function User($name)
        {
            $this->name = $name; //将属性name设置成创建对象时传入的参数
        }
        //获取属性$name
        function getName()
        {
            return $this->name; //返回name属性
        }
        //是否具有浏览权限
        function ViewAccess()
        {
            return "No"; //抽象基类的浏览权限为No
        }
        //是否具有编辑权限
        function EditAccess()
        {
            return "No"; //抽象基类的编辑权限为No
        }
        //是否具有删除权限
        function DeleteAccess()
        {
            return "No"; //抽象基类的删除权限为No
        }
        //是否具有用户管理权限
        function ManageAccess()
        {
            return "No"; //抽象基类的管理权限为No
        }
    }
    //普通用户
    class Client extends User
    {
        //重写ViewAccess函数,对普通用户授予浏览权限
        function ViewAccess()
        {
            return "Yes";
        }
    }
    //管理员
    class Administrator extends User
    {
    //重写ViewAccess函数,对普通用户授予浏览权限
        function ViewAccess()
        {
            return "Yes";
        }
    //重写EditAccess函数,对普通用户授予编辑权限
        function EditAccess()
        {
            return "Yes";
        }
    //重写DeleteAccess函数,对普通用户授予删除权限
        function DeleteAccess()
        {
            return "Yes";
        }
    }
    //维护人员
    class Supporter extends User
    {
    //重写ViewAccess函数,对普通用户授予浏览权限
        function ViewAccess()
        {
            return "Yes";
        }
    //重写EditAccess函数,对普通用户授予编辑权限
        function EditAccess()
        {
            return "Yes";
        }
    //重写DeleteAccess函数,对普通用户授予删除权限
        function DeleteAccess()
        {
            return "Yes";
        }
    //重写ManageAccess函数,对普通用户授予管理权限
        function ManageAccess()
        {
            return "Yes";
        }
    }
    //工厂类
    class Factory
    {
        //静态成员属性
        private static $users = array("Simon"=>"Client", "Elaine"=>"Administrator", "Bob"=>"Supporter");
        //创建对象的成员方法
        static function Create($name)
        {
            //根据成员属性的不同创建不同的对象
            switch (self::$users[$name])
            {
                case "Client": 
                   return new Client($name);
                case "Administrator": 
                   return new Administrator($name);
                case "Supporter": 
                   return new Supporter($name);
            }
        }
    }
    //一个存放用户名的数组
    $users = array("Elaine", "Simon", "Bob");
    //对于每个用户分析其权限
    foreach($users as $user)
    {
        $obj = Factory::Create($user); //创建对象
        echo $obj->getName() . "的权限:\n";
        echo "浏览:".$obj->ViewAccess()."\n"; //输出浏览权限
        echo "修改:".$obj->EditAccess()."\n"; //输出修改权限
        echo "删除:".$obj->DeleteAccess()."\n"; //输出删除权限
        echo "管理:".$obj->ManageAccess()."\n"; //输出管理权限
    }
    ?>
      

  8.   

    谢谢楼上两位,虽然并不是我想要的。但是factory的思路和11楼给的方式也非常不错。当然,11楼并没有返回object,只是间接调用了函数而已。 factory实际上我也就必须把每页都该一遍。但是提供了一种快速生成object的方法。 我不知道java里会怎么用,至少php还是可行的,因为不用给object定义类型。 也就是说java里面必须都是衍生于同一个父类的才能用factory,而实际上php就完全没有这个限制,什么类都行。