超类静态var共享给孩子们

时间:2014-05-23 08:25:20

标签: php inheritance static

标题有点误导,因为我知道它不可能与孩子们共享一个静态变量,但我正在寻找一种方法来解决我的问题而不用共享静态变量做

我有一个名为' Model'的超类。以及一些名为“用户”的基础子课程。和'公司'。我希望尽可能自动化,以便子类只有字段而已。

我想创建静态' GetAll'和' GetByKey'超类中的方法,以便我可以使用以下代码:

 $users = User::getAll();
 $company = Company::getByKey(34); // Where 34 is the ID.

就我而言,公司课应该知道他的主键,而不是每次都告诉他。我不想在子类中避免这样的方法:

public static function getByUserId($userId)
{
    return static::find(array('userId' => $userId));
}

为此,我创建了一个静态变量' primaryKey'在超类中。问题是,没有一个完美的地方可以设置'变量。如果我唯一能做的就是获得所有用户,那么构造函数就不会被使用。接下来,静态变量属于Model,这意味着如果我有这样的代码,它将被覆盖:

 $company = new Company(); // Model sets 'primaryKey' to 'id'
 $user = User::GetByKey('myUsername'); // The 'primaryKey' is still 'id', but it should be 'username'

想要保存$ primaryKey,因为每次我请求某些模型时,从MySQL获取主键只是开销。

有没有办法让子类拥有自己的静态变量值而不在特定的类中创建它们?我想尽量减少模型的工作量。使用反射或魔术方法完全没有问题。在最荒谬的情况下,我必须创建一个DatabaseManager,它有一个数组,可以保存所有模型的所有信息。

注意:即使不推荐或丑陋的代码,我也会问我的问题是否有解决方案。我知道这个问题已被多次询问过。

提前致谢,

1 个答案:

答案 0 :(得分:0)

您可以使用服务&这里的DataMapper模式使用脏静态

根据How should a model be structured in MVC?

此外,您似乎无法理解模型的内容,请查看上面的链接,仔细阅读。

我无法在此示例中真正实现您的代码构思 - 因为我并不真正理解那里发生的事情(静态力量)

我会尝试向您展示一个非常相似的例子:

class CompanyBusiness {

    private $mapper;
    private $domain;

    public function __construct(CompanyMapper $mapper, CompanyDomain $domain) {
        $this->mapper = $mapper;
        $this->domain = $domain;
    }
}

在此示例中,您有一个Comapany服务,它现在处理comapny工作者(雇主)。您希望从向comapny添加新工作开始,该服务将从您处理输入/输出(即控制器)的位置接收数据,然后将数据初始化为{{1 }}。注意:如果您的电子邮件有效并且他至少23岁,您的公司只允许该工作人员,因此您必须在DomainObject中查看以下示例中的数据:

DomainObject

您的域名方法:

/**
 * Adds a new worker to the comapny, following the company rules.
 * @param $firstname    string  First name of the worker
 * @param $lastname     string  Last name of the worker
 * @param $age          int     Age of the worker
 * @param $email        string  E-mail of the worker
 * @return bool         Business action succeed
 */
public function addWorker($firstname, $lastname, $age, $email) {
    $this->domain->setFirstname($firstname);
    $this->domain->setLastname($lastname);
    $this->domain->setAge($age);
    $this->domain->setEmail($email);

    if ($this->domain->validated()) {
        $this->mapper->addNewWorker($this->domain);
        return true;
    }
    else {
        // error has occured, maybe set error message?
    }
    return false;
}

注意:/** * Checks if worker follows the requirements/valid * @return bool valid */ public function validated() { return $this->age >= self::MINIMUM_AGE && filter_var($this->email, FILTER_VALIDATE_EMAIL); } 是域类中的常量。

DataMapper是一个有趣的部分,它是处理数据结构的类,即MySQL数据库。

我在上面的实现中如何使用它:

self::MINIMUM_AGE

基本上DataMappers应该包含数据库连接,并不重要 - 我已经使用父类将其存储在那里。

然后又一个例子,获取特定工人的个人资料数据(通过他的身份证)

class CompanyMapper extends Mapper {

    private $tables = array(
        'workers'   => 'company_workers'
    );

    public function addNewWorker(CompanyDomain $company) {
        parent::getDB()->insert($this->tables['workers'], array(
            "first_name"    => $company->getFirst(),
            "last_name"     => $company->getLast(),
            "age"           => $company->getAge(),
            "email"         => $company->getEmail()));
    }

    public function getWorkerProfileByID($id) {
        /** @var $query PDOStatement */
        $query = parent::getDB()->fetch($this->tables['workers'], array("worker_id" => $id));
        return $query->fetch();
    }
}

此外,如果您要使用此类依赖注入工作,您最终会厌倦注入和关注这些构造函数中的依赖项,您可以使用DI容器自动创建&为你注入这些物品,try this one采用查看自述文件,它将解释&展示有用的东西。