web-dev-qa-db-ja.com

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にインポートして、リファクタリングを開始できるようにします。ありがとう。

12
david2278

短い答え:


_$this->company = new Company;_関数に___construct_を追加します。これで、phpStormは_$this->company_の機能を正確に認識します。

説明:


_Company::__construct_内から_User::__construct_を呼び出すため、これはアプリケーションにとって非常に複雑になる可能性があります-私が見ることができるものから、Companyのインスタンスがすでに存在するため、処理とメモリペイロードを効果的に倍増させますおそらく、Userクラスの外部にあるCompanyのインスタンスを作成する必要がなくなるでしょうか?

また、メモリに_$company_オブジェクトをすでに取得しているため、クラスを正規化し、すべての「会社」機能を「会社」クラスに配置(および使用)し、「ユーザー」を制限する方が現実的です。 「ユーザー」機能のクラスにして、ラウンドロビン$company->getCompanyName()関数-とにかく単に$user->getCompanyName()を呼び出すのではなく、$company->getCompanyName()を使用してその情報を取得するだけです。

それを試してみて、あなたの考えを見てください?

4

完全を期すため、そしてSOユーザーに実行可能な代替手段を提供するために、私はPHPdocsを使用するコメントベースのソリューションを好む)これを行うには、あなたのインスタンスで私はやります:

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

問題のクラスを使用するコードを編集するときに意味のある情報を使用して、十分に文書化されたクラスの利点を得ることができます。私は定期的にphpdocsを変数、コンストラクターメソッド、およびほとんどのパブリックビジネスメソッドに配置しました。体系的にそれを行うことは、大きなコードベースとPHPStormを使用して時間をかけて得る利益のために支払うための小さな費用です。

詳細は PHPDoc.org にあります

30
YvesLeBorg