【问题标题】:PHPStorm - Method not found in subject classPHPStorm - 在主题类中找不到方法
【发布时间】:2015-10-11 18:53:19
【问题描述】:

我有一个正在处理的项目,我刚刚切换到 PHPStorm,因为它开始变大,我需要一些重构工具。我注意到,由于变量没有被声明为类型(就像它们在 Java 中一样),PHPStorm 有时不知道在哪里寻找对变量名的方法调用。这是我的代码。

<?php

require_once "autoloader.php";


class User {

    private $userID;
    private $email;
    private $encryptedPassword;
    private $userDBWriter;
    private $company;
    private $companyInfoChangeRequest;
    private $admin;
    private $accountIsActive;
    private $dealTracker;
    private $changeRequestPending;

    function __construct($email, $encryptedPassword) {
        $this->email = $email;
        $this->encryptedPassword = $encryptedPassword;
        $this->userDBWriter = new UserDBWriter();
        $this->admin = false;
        $this->dealTracker = new DealTracker($this);
    }

    public function addUserToDB() {
        $this->userDBWriter->addUserToDB($this);
    }

    public function setUserAsAdmin($adminStatus) {
        $this->admin = (bool) $adminStatus;
    }

    public function userAccountActiveStatus($accountStatus) {
        $this->accountIsActive = (bool) $accountStatus;
    }

    public function setUserID($userID) {
        $this->userID = $userID;
    }

    public function getUserID() {
        return $this->userID;
    }

    public function getEmail() {
        return $this->email;
    }

    public function isAdmin() {
        return $this->admin;
    }

    public function isAccountActive() {
        return $this->accountIsActive;
    }

    public function getEncryptedPassword() {
        return $this->encryptedPassword;
    }

    public function toArray() {
        $userArray = array(
            "id"=>$this->userID,
            "email"=>$this->email,
            "company_name"=>$this->getCompanyName(),
            "business_type"=>$this->getBusinessType(),
            "company_phone"=>$this->getCompanyPhone(),
            "company_street"=>$this->getCompanyStreet(),
            "company_city"=>$this->getCompanyCity(),
            "company_zip"=>$this->getCompanyZip(),
            "monday_hours"=>$this->getMondayHours(),
            "tuesday_hours"=>$this->getTuesdayHours(),
            "wednesday_hours"=>$this->getWednesdayHours(),
            "thursday_hours"=>$this->getThursdayHours(),
            "friday_hours"=>$this->getFridayHours(),
            "saturday_hours"=>$this->getSaturdayHours(),
            "sunday_hours"=>$this->getSundayHours(),
            "store_image_path"=>$this->getStoreImagePath(),
            "shop_description"=>$this->getShopDescription(),
            "deals"=>$this->dealTracker->dealsToArray()
            );
        return $userArray;  
    }

    public function addCompany(Company $company) {
        $this->company = $company;
    }

        public function getCompanyName() {
            return $this->company->getCompanyName();
        }

        public function getBusinessType() {
            return $this->company->getBusinessType();
        }

        public function getCompanyPhone() {
            return $this->company->getCompanyPhone();
        }

        public function getCompanyStreet() {
            return $this->company->getCompanyStreet();
        }

        public function getCompanyCity() {
            return $this->company->getCompanyCity();
        }

        public function getCompanyState() {
            return $this->company->getCompanyState();
        }

        public function getCompanyZip() {
            return $this->company->getCompanyZip();
        }

        public function getMondayHours() {
            return $this->company->getMondayHours();
        }

        public function getTuesdayHours() {
            return $this->company->getTuesdayHours();
        }

        public function getWednesdayHours() {
            return $this->company->getWednesdayHours();
        }

        public function getThursdayHours() {
            return $this->company->getThursdayHours();
        }

        public function getFridayHours() {
            return $this->company->getFridayHours();
        }

        public function getSaturdayHours() {
            return $this->company->getSaturdayHours();
        }

        public function getSundayHours() {
            return $this->company->getSundayHours();
        }

        public function getStoreImagePath() {
            return $this->company->getStoreImagePath();
        }

        public function getShopDescription() {
            return $this->company->getShopDescription();
        }

        public function isBusinessVerified() {
            return $this->company->getVerifiedBusiness();
        }

    public function setCompanyInfoChangeRequest($company) {
        $this->companyInfoChangeRequest = $company;
    }

    public function submitCompanyInfoChangeRequest($company) {
        $this->companyInfoChangeRequest = new CompanyInfoChangeRequest($this, $company);
        $this->companyInfoChangeRequest->submitCompanyInfoChangeRequest();
    }

    public function cancelCompanyInfoChangeRequest() {
        if ($this->changeRequestPending) {
            $this->companyInfoChangeRequest->cancelRequest();
        }
    }

    public function isCompanyChangeRequestPending() {
        return $this->changeRequestPending;
    }

    public function approveCompanyInfoChangeRequest($company) {
        $this->companyInfoChangeRequest->approveCompanyInfoChangeRequest($this);
    }

    public function setChangeRequestPending($isPending) {
        $this->changeRequestPending = (bool) $isPending;
    }
        public function getChangeRequestCompanyName() {
            return $this->companyInfoChangeRequest->getCompanyName();
        }

        public function getChangeRequestBusinessType() {
            return $this->companyInfoChangeRequest->getBusinessType();
        }

        public function getChangeRequestCompanyPhone() {
            return $this->companyInfoChangeRequest->getCompanyPhone();
        }

        public function getChangeRequestCompanyStreet() {
            return $this->companyInfoChangeRequest->getCompanyStreet();
        }

        public function getChangeRequestCompanyCity() {
            return $this->companyInfoChangeRequest->getCompanyCity();
        }

        public function getChangeRequestCompanyState() {
            return $this->companyInfoChangeRequest->getCompanyState();
        }

        public function getChangeRequestCompanyZip() {
            return $this->companyInfoChangeRequest->getCompanyZip();
        }

        public function getChangeRequestMondayHours() {
            return $this->companyInfoChangeRequest->getMondayHours();
        }

        public function getChangeRequestTuesdayHours() {
            return $this->companyInfoChangeRequest->getTuesdayHours();
        }

        public function getChangeRequestWednesdayHours() {
            return $this->companyInfoChangeRequest->getWednesdayHours();
        }

        public function getChangeRequestThursdayHours() {
            return $this->companyInfoChangeRequest->getThursdayHours();
        }

        public function getChangeRequestFridayHours() {
            return $this->companyInfoChangeRequest->getFridayHours();
        }

        public function getChangeRequestSaturdayHours() {
            return $this->companyInfoChangeRequest->getSaturdayHours();
        }

        public function getChangeRequestSundayHours() {
            return $this->companyInfoChangeRequest->getSundayHours();
        }

        public function getChangeRequestStoreImagePath() {
            return $this->companyInfoChangeRequest->getStoreImagePath();
        }

        public function getChangeRequestShopDescription() {
            return $this->companyInfoChangeRequest->getShopDescription();
        }

}

带有警告"Method not found in class..." 的一些方法是getCompanyName() getBusinessType() getCompanyPhone() 和任何其他调用$this-&gt;company$this-&gt;companyInfoChangeRequest 上的方法的方法。

我知道为什么会这样。这是因为 PHPStorm 不知道变量是什么实例。我注意到这里Method not found in class 他们使用 PHPDoc 注释来输入提示变量类型,以便 PHPStorm 知道在哪里查找。 我想要一个“不发表评论”的解决方案,因为如果我以后遇到评论,我可能会删除它。对不起,上课时间太长了。我正在将项目导入 PHPStorm,以便开始进行一些重构。谢谢。

【问题讨论】:

  • " 我想要一个“不发表评论”的解决方案,因为如果我以后遇到评论我可能会删除它。” i> 为什么要“删除”? PHPDoc cmets 有什么问题?你见过任何现代框架/库,它们是如何使用 PHPDoc 的吗?
  • 为什么要删除 cmets?因为他们把代码弄乱了。您可以为文档提出论据,如果做得对,那就太好了。如果要删除评论,那么重构工具就会中断。我宁愿依赖代码而不是评论。
  • 显然,选择权完全在您手中(在您想知道这段代码的作用以及这些字段/方法的作用之后,想想其他将使用该代码的用户/开发人员)。我会把它留在这里,以防你会感兴趣/还没有看到它。 phptherightway.com
  • 谢谢,我一定会看看的。

标签: php phpstorm type-hinting


【解决方案1】:

简答:


$this-&gt;company = new Company; 添加到您的__construct 函数中。现在,phpStorm 确切地知道$this-&gt;company 有什么功能。

解释:


这可能会使您的应用程序变得非常复杂,因为它会从User::__construct 中调用Company::__construct——有效地使其处理和内存负载加倍,因为据我所知,Company 的实例已经存在.也许您不再需要在 User 类之外创建 Company 实例?

此外,由于您已经在内存中获得了 $company 对象,因此规范化您的类并将(和使用)所有“公司”功能放在“公司”类中并限制“用户”似乎更实用" class to "User" 功能,并简单地使用$company-&gt;getCompanyName() 来获取该信息,而不是循环的$user-&gt;getCompanyName() 函数——它只是调用$company-&gt;getCompanyName()

试一试,看看你的想法?

【讨论】:

  • 好吧,这很有道理。我明白你对公司的看法。公司的事情是公司属于用户。这就是为什么系统的其他部分会询问用户他们的公司名称的原因。我应该那样做吗?
  • 项目越大,您需要的相关数据和功能就越分区(在类中)。 "Method 'x' not found in class 'y'..." 等奇怪的错误可以帮助您编写好代码;现在你可以明白为什么了! :) 要回答您关于 usercompany 所有权的评论问题,请考虑一个用户可能拥有多个公司的场景,并且该框架为参考,研究数据库理论中的一对多关系:link
  • 我的回答中关于代码的一个警告。照原样,将有 两个 的 Company 实例浮动;一个在全局范围内,一个在 User 的实例中。请注意,对一个副本所做的更改不会反映在另一个副本的值中!
  • 我正在考虑。我确实确实想到,稍后我们可能希望每个用户拥有超过 1 家公司。我绝对不会复制、粘贴和忘记它。我认为一对多的关系是我要去的,但我们会看到的。谢谢。
【解决方案2】:

为了完整起见,并为 SO 用户提供可行的替代方案,我更喜欢 基于 cmets 的解决方案,它使用 PHPdocs 来执行此操作,因此在您的实例中我会这样做:

/**
*   @var Company 
*/
private $company.

当您编辑使用相关类的代码时,您将受益于记录良好的类,并获得有意义的信息。我定期将 phpdocs 放在变量、构造方法和大多数公共业务方法上。系统地执行此操作只需付出很小的代价,您就会随着时间的推移使用大型代码库和 PHPStorm 获得收益。

PHPDoc.org找到详细信息

【讨论】:

【解决方案3】:

对于遇到此问题的人,如果文件长度很大(>5000 行代码),则代码分析在 2021.1 版本之前停止工作。

https://youtrack.jetbrains.com/issue/WI-31569?_ga=2.242515972.704716569.1621073600-273941255.1612557945

如果您使用的是以前的版本,似乎只有重构代码以减少代码长度的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2011-11-30
    • 2014-01-18
    相关资源
    最近更新 更多