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


How do I ensure a method exists before calling it?

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

它们都有自己的对象。因此user将定义$users = new users (), company将定义$place = new Places()..

现在这工作良好,有一个页面,两者都应该看到的内容。在这个页面中有一个方法检查$users->id()是否与您登录时使用的相同。工作正常,但是当你使用company登录时,它会抛出错误,因为$users没有定义。

我该怎么办?我是否应该将$users设置为false,然后从中签出?或者在执行此语句之前确定您登录的内容,以便它不会执行。主意吗?

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

我建议不要有两个类——用户和公司——而是有一个用户类,"公司"只是用户的一种类型(或派生类)。然后你就不会有代码来检查哪些对象是有效的。这将大大简化应用程序逻辑。

听起来这里的Company只是一种特殊类型的User。

如果Company类型用户具有与user类型用户相似的模型,那么我将从user扩展Company来实现额外的功能。

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
}

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

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

或者,您可以稍微改变一下结构,使用通用用户模型,并使用定义登录类型的字段:

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

使用它,您不必担心传递的对象类型,您可以简单地检查字段以确定登录类型,,除非您的两个模型具有完全不同的数据

除了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;
        }  
    }
}