Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:类范围-外部类最佳实践?_Php_Class_Scope - Fatal编程技术网

PHP:类范围-外部类最佳实践?

PHP:类范围-外部类最佳实践?,php,class,scope,Php,Class,Scope,我是个新手 我正在使用PDO连接,到目前为止一切正常。我可以登录/注销,在屏幕上显示用户信息。所有更新、插入等所有工作。我有一个关于我的网站结构的一般查询,然后我再进一步 我的主要问题是 将我需要的变量传递到我调用的方法中是否更好(大多数使用user\u id,因此我在大多数方法调用中调用$user->user\u id),但是我应该如何联系外部方法,例如来自$user对象的方法 还是在创建新的$task对象时传递$user对象更好 请参见下面的代码片段和示例 我不想从头开始,所以扩展BaseM

我是个新手

我正在使用PDO连接,到目前为止一切正常。我可以登录/注销,在屏幕上显示用户信息。所有更新、插入等所有工作。我有一个关于我的网站结构的一般查询,然后我再进一步

我的主要问题是

将我需要的变量传递到我调用的方法中是否更好(大多数使用user\u id,因此我在大多数方法调用中调用$user->user\u id),但是我应该如何联系外部方法,例如来自$user对象的方法

还是在创建新的$task对象时传递$user对象更好

请参见下面的代码片段和示例

我不想从头开始,所以扩展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的头(“位置:…”),我可以在方法调用中包含用户id

$task -> redirect($user -> user_id, "newloc.php")
这会将用户转发到请求的页面,并使用用户id将其记录到数据库中(在开发模式下可以消除过多的页面循环)

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

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

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

这个系统显然比这复杂得多。这篇文章中的例子只是一个让我明白我观点的例子


谢谢您的时间。

您可以在
任务
类中使用受保护的类属性,如
$\u user
,如下所示:

class Task extends BaseModel
{
    protected $_user;

    public function __construct(User $user)
    {
        $this->_user = $user;
    }
}
public function getUser()
{
    return $this->_user;
}
$this->getUser()->userMethod(); // this is a method in User class
并添加此属性的getter方法,如下所示:

class Task extends BaseModel
{
    protected $_user;

    public function __construct(User $user)
    {
        $this->_user = $user;
    }
}
public function getUser()
{
    return $this->_user;
}
$this->getUser()->userMethod(); // this is a method in User class
因此,您可以在
Task
类中使用
User
类方法,如下所示:

class Task extends BaseModel
{
    protected $_user;

    public function __construct(User $user)
    {
        $this->_user = $user;
    }
}
public function getUser()
{
    return $this->_user;
}
$this->getUser()->userMethod(); // this is a method in User class

注意:我声明$_user
受保护
而非
私有
,因为它可以在
任务
类的所有子类中访问(如果您想扩展该类)

欢迎。我感谢您为编写“完整“问题。但是你可能想突出你的实际问题,或者删除不相关的代码,以鼓励人们阅读到最后。谢谢,@Zsolt Szilagy我已经将问题移到了帖子的顶部,并清楚地标记了它。代码片段现在可以由回答者自行阅读了。”