PHPStorm — метод не найден в предметном классе

У меня есть проект, над которым я работаю, и я просто переключился на 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 или же $this->companyInfoChangeRequest,

Я знаю, почему это происходит. Это потому, что PHPStorm не знает, к чему относится переменная. Я заметил здесь Метод не найден в классе они использовали комментарий PHPDoc, чтобы напечатать подсказку типа переменной, чтобы PHPStorm знал, где искать. Я хотел бы решение «без комментариев» потому что, если я столкнусь с комментарием в будущем, я могу его удалить. Извините за длинный класс. Я импортирую проект в PHPStorm, чтобы начать рефакторинг. Благодарю.

8

Решение

Короткий ответ:


добавлять $this->company = new Company; на ваш __construct функция. Теперь phpStorm точно знает, какие функции $this->company есть.

Объяснение:


Это может сделать вещи очень сложными для вашего приложения, потому что это вызовет Company::__construct изнутри User::__construct — эффективно удваивает его обработку и полезную нагрузку памяти, потому что, как я вижу, экземпляр Company уже существует. Может быть, вам не нужно создавать экземпляр компании за пределами User класс больше?

Кроме того, так как у вас уже есть $company Объект в памяти, кажется более практичным нормализовать ваши классы и поместить (и использовать) все функциональные возможности «Company» в класс «Company», и ограничить класс «User» функциональностью «User», и просто использовать $company->getCompanyName() чтобы получить эту информацию, вместо кругового $user->getCompanyName() функция — которая просто вызывает $company->getCompanyName() в любом случае.

Попробуйте, посмотрите, что вы думаете?

2

Другие решения

Для полноты картины и для предоставления пользователям SO жизнеспособной альтернативы я предпочитаю решение на основе комментариев который использует PHPdocs для этого, поэтому в вашем случае я бы сделал:

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

вы получаете преимущества хорошо документированных классов с полезной информацией при редактировании кода, использующего данный класс. Я регулярно помещаю phpdocs в vars, методы конструктора и большинство общедоступных бизнес-методов. Делать это систематически — это небольшая цена за те преимущества, которые вы будете получать со временем благодаря большой базе кода и PHPStorm.

найти подробности на PHPDoc.org

21

По вопросам рекламы [email protected]