父类: user
子类:
Shared user
Orign user
希望用父类生成objet
然后父类有一个函数来确定使用的子类
用此objet 来直接调用子类的函数不知道有没有办法可以实现.因为所有的页面都调用一个类来生成object,可现在这个object有两种情况了,我也不可能每一页都改,所以就希望写一个空的父类,在这个父类里添加一个判断函数,然后把两种情况写成两个子类,通过条件来判定到底使用哪一个,这样,我就不用更改原来的页面。
子类:
Shared user
Orign user
希望用父类生成objet
然后父类有一个函数来确定使用的子类
用此objet 来直接调用子类的函数不知道有没有办法可以实现.因为所有的页面都调用一个类来生成object,可现在这个object有两种情况了,我也不可能每一页都改,所以就希望写一个空的父类,在这个父类里添加一个判断函数,然后把两种情况写成两个子类,通过条件来判定到底使用哪一个,这样,我就不用更改原来的页面。
用到的地方include就行了。
{
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();?>
我绕了一个弯,实现了这个功能。不知道是不是楼主想实现的功能?
应该是这样的:
每一个页面都有这样一个函数:
$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,但显然,这样做是不肯能的。
我想问问呢有没有什么办法能绕过去。
$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
?>
下面是代码<?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"; //输出管理权限
}
?>