在调用方法之前如何确保方法存在?

时间:2011-08-17 01:15:13

标签: php

用户和公司可以登录我的网站。

他们每个人都有自己的对象。 因此用户将定义$ users = new Users(),并且公司有$ place = new Places()..

现在这很好用,有一个页面,两者都应该看到内容。 在此页面中,有一种方法可以检查$ users-> id()是否与您登录时的相同。工作正常,但是当您使用公司登录时,由于未定义$ users,因此会抛出错误。

我该怎么办?我应该将$ users设置为false,然后从中查看吗?或者有一些东西可以确定你在此声明之前登录的内容,因此它不会执行..想法?

5 个答案:

答案 0 :(得分:4)

听起来你有一个基本的概念问题。

我建议不要让两个类 - 用户和公司 - 而是一个用户类,而'公司'只是一种用户(或派生类)。然后你不会在代码上撒上支票来查看哪些对象有效。它大大简化了应用程序逻辑。

答案 1 :(得分:1)

听起来公司在这种情况下只是一种特殊类型的用户。

如果公司类型用户具有与用户类型用户类似的模型,那么我会将公司从用户那里扩展出来以实现其他功能。

class Company extends User
{
    ...
}

但是,如果这两种类型不同并且它们唯一的共同点就是您可以使用它们登录,我将创建一个可用于登录的基类和ID属性,然后使用它们的单独模型定义其余部分。

abstract class BaseUser
{
    public function getId()
    {
        return $this->id;
    }

    protected $id = null;
}

class User extends BaseUser
{
    // user specific stuff here
}

class Company extends BaseUser
{
    // company specific stuff here
}

答案 2 :(得分:0)

没有更多背景,很难给出明确的答案。但基本上你需要在调用其中一个方法之前检查$ users对象是否存在。有很多方法可以做到这一点,最简单的可能是:

if (is_object($users)) {
  // use the object
}

答案 3 :(得分:0)

或者,您可以稍微更改一下结构,然后选择通用用户模型,并使用一个字段来定义登录的类型:

<?php
    public class User
    {
        /* Data fields */
        public $logonType = "USER"; // or "COMPANY"
    }
?>

使用它,您不必担心传递的对象类型,您只需检查字段以确定登录类型,除非您的两个模型具有截然不同的数据

答案 4 :(得分:0)

除了Mike的评论,您还可以使用Factory根据类型创建特定用户。

class Factory 
{
    public static function create($type='user')
    {
        switch ($type) {
            case 'user':
                return new User();
            break;
            case 'company':
                return new Company();
            break;
            default:
                throw new Exception('Invalid type');
            break;
        }  
    }
}