PHPStorm - 在主题 class 中找不到方法
PHPStorm - Method not found in subject class
我有一个正在处理的项目,我刚刚切换到 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->company
或 [= 上的方法的任何其他方法17=].
我知道为什么会这样。这是因为 PHPStorm 不知道变量是什么的实例。我在这里注意到 他们使用 PHPDoc 注释来键入提示变量类型,以便 PHPStorm 知道在哪里查找。 我想要一个 "non-comment" 解决方案 因为如果我以后遇到评论,我可能会删除它。很抱歉 class。我正在将项目导入 PHPStorm,这样我就可以开始进行一些重构。谢谢。
简答:
将 $this->company = new Company;
添加到您的 __construct
函数中。现在,phpStorm 确切地知道 $this->company
有什么功能。
解释:
这可能会使您的应用程序变得非常复杂,因为它会从 User::__construct
中调用 Company::__construct
-- 有效地将其处理和内存负载加倍,因为据我所知,一个实例Company
个已经存在。也许您不再需要在 User
class 之外创建 Company 实例?
此外,由于您已经在内存中获得了一个 $company
对象,因此规范化您的 classes 并将所有 "Company" 功能放入(并使用)似乎更为实用"Company" class,并将 "User" class 限制为 "User" 功能,只需使用 $company->getCompanyName()
来获取该信息,而不是回合-robin $user->getCompanyName()
函数 - 无论如何只调用 $company->getCompanyName()
。
试一试,看看你的想法?
为了完整起见,并为 SO 用户提供可行的替代方案,我更喜欢基于注释的解决方案,它使用 PHPdocs 来执行此操作,因此在您的实例中我会这样做:
/**
* @var Company
*/
private $company.
当您编辑使用相关 class 的代码时,您将受益于文档完善的 classes,以及有意义的信息。我定期将 phpdocs 放在变量、构造函数方法和大多数 public 业务方法上。系统地执行此操作对于您将随着时间的推移使用大型代码库和 PHPStorm 获得的收益付出很小的代价。
找到详细信息
对于遇到此问题的人,如果文件长度很大(>5000 行代码),代码分析在版本 2021.1 之前停止工作。
如果您使用的是以前的版本,唯一的解决方案似乎是重构代码以减少代码长度。
我有一个正在处理的项目,我刚刚切换到 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->company
或 [= 上的方法的任何其他方法17=].
我知道为什么会这样。这是因为 PHPStorm 不知道变量是什么的实例。我在这里注意到
简答:
将 $this->company = new Company;
添加到您的 __construct
函数中。现在,phpStorm 确切地知道 $this->company
有什么功能。
解释:
这可能会使您的应用程序变得非常复杂,因为它会从 User::__construct
中调用 Company::__construct
-- 有效地将其处理和内存负载加倍,因为据我所知,一个实例Company
个已经存在。也许您不再需要在 User
class 之外创建 Company 实例?
此外,由于您已经在内存中获得了一个 $company
对象,因此规范化您的 classes 并将所有 "Company" 功能放入(并使用)似乎更为实用"Company" class,并将 "User" class 限制为 "User" 功能,只需使用 $company->getCompanyName()
来获取该信息,而不是回合-robin $user->getCompanyName()
函数 - 无论如何只调用 $company->getCompanyName()
。
试一试,看看你的想法?
为了完整起见,并为 SO 用户提供可行的替代方案,我更喜欢基于注释的解决方案,它使用 PHPdocs 来执行此操作,因此在您的实例中我会这样做:
/**
* @var Company
*/
private $company.
当您编辑使用相关 class 的代码时,您将受益于文档完善的 classes,以及有意义的信息。我定期将 phpdocs 放在变量、构造函数方法和大多数 public 业务方法上。系统地执行此操作对于您将随着时间的推移使用大型代码库和 PHPStorm 获得的收益付出很小的代价。
找到详细信息对于遇到此问题的人,如果文件长度很大(>5000 行代码),代码分析在版本 2021.1 之前停止工作。
如果您使用的是以前的版本,唯一的解决方案似乎是重构代码以减少代码长度。