【问题标题】:PHP: Class Scope - external class best practice?PHP:Class Scope - 外部类最佳实践?
【发布时间】:2014-01-20 14:47:48
【问题描述】:

我对课程很陌生。

我正在使用 PDO 连接,到目前为止一切正常。我可以登录/注销,在屏幕上显示用户信息。所有更新插入等所有工作。在我继续之前,我对我的网站的结构有一个一般性的询问。

我的主要问题是

将我需要的变量传递给我调用的方法会更好吗(大多数使用 user_id,所以我会在大多数方法调用中调用 $user -> user_id),但是我应该如何联系外部方法比如来自 $user 对象的方法?

或者在创建新的 $task 对象时传递 $user 对象更好?

代码 sn-ps 和示例见下文

我不想从头开始,所以扩展 BaseModel 将是我推进这个项目的方式......

我的设置与下面类似;

//main class

class BaseModel(){
//configure db here $db
//subclasses can use as self:$db
//there is if($db doesnt exist).. to stop multiple connection threads being 
//created when multiple objects are created.
}

//...and I have 2 subclasses

class User Extends BaseModel
//create new user object, confirm login details (cookie, ip etc)
//returns user object as array.
}


class Tasks Extends BaseModel

//do various cleanup tasks
}

在主脚本中,我为每个脚本创建一个新实例:

$user = new User();
$task = new Task();

如果我想调用重定向任务(PHP 的 header("Location:...) 我可以在方法调用中包含 user_id;

$task -> redirect($user -> user_id, "newloc.php")

这会将用户转发到请求的页面,并使用用户 ID 将其记录到数据库中(在开发模式下有助于消除过多的页面循环)。

显然这很简单,但是如果我想直接在 $task 类中与 $user 类进行通信呢?我发现我可以创建一个传递 $user 对象的 $task 对象;

$task = new Task($user);

在我的测试中,我发现我可以访问 $user 数据和方法(例如 $this -> user->user_id),并允许我访问其中的方法,例如;

(注意:我没有记录用户重定向。这是我能想到的最简单的例子);

$task -> redirect("newurl.php");

//within redirect
public function redirect($url){
$this -> user -> increaseTotalRedirects();

系统显然比这复杂得多。这篇文章中的示例实际上只是说明我的观点的一个示例

感谢您的宝贵时间。

【问题讨论】:

  • 欢迎。感谢您为编写“完整”问题所做的努力。然而,您可能希望突出显示您的实际问题,并可能删除不相关的代码,以鼓励人们阅读到最后。
  • 谢谢,@Zsolt Szilagy 我已将问题移至帖子顶部并明确标记。现在可以由回答者自行决定读取代码的 sn-ps。 :)

标签: php class scope


【解决方案1】:

您可以在 Task 类中使用像 $_user 这样的受保护类属性,如下所示:

class Task extends BaseModel
{
    protected $_user;

    public function __construct(User $user)
    {
        $this->_user = $user;
    }
}

并像这样添加这个属性的getter方法:

public function getUser()
{
    return $this->_user;
}

所以你可以像这样在Task 类中使用User 类方法:

$this->getUser()->userMethod(); // this is a method in User class

注意:我声明了 $_user protected 而不是 private,因为它可以在 Task 类的所有子类中访问(如果你想扩展这个类)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2012-05-19
    • 2021-01-11
    • 2018-01-04
    • 2014-03-02
    • 2013-11-12
    • 1970-01-01
    相关资源
    最近更新 更多