2017-06-27 28 views
1

我在學php的命名空間。在php中使用父類或名稱空間訪問繼承的類

我在vendor/anuj-tbe/social-upload目錄中創建3個文件,有樹視圖像

social-upload 
|- SocialUpload.php 
|- Facebook 
     |- FacebookUpload.php 
|- Youtube 
     |- YoutubeUpload.php 

及其內容如下:

SocialUpload.php

<?php 
namespace SocialUpload; 

class SocialUpload { 

} 

的Facebook/FacebookUpload .php

<?php 
namespace SocialUpload\FacebookUpload; 

use SocialUpload\SocialUpload; 

class FacebookUpload extends SocialUpload { 
    private $access_token = ''; 

    function __construct($access_token) 
    { 
     $this->access_token = $access_token; 
    } 

    public function upload($video_file, $file_path) 
    { 
     return true; 
    } 
} 

的Youtube/YoutubeUpload.php

<?php 
namespace SocialUpload\YoutubeUpload; 

use \SocialUpload\SocialUpload; 

class YoutubeUpload extends SocialUpload { 
    private $access_token; 

    function __construct($access_token) 
    { 
     $this->access_token = $access_token; 
    } 

    public function upload($video_file, $file_path) 
    { 
     return true; 
    } 
} 

現在,我想要求任何地方使用它在我的應用程序。

我可以使用SocialUpload類的對象訪問FacebookUploadupload()YoutubeUpload類?

此外,如何將它添加到作曲家自動加載從任何地方使用命名空間訪問這些類?

+1

如果你正在學習,看看http://www.php-fig.org/psr/ psr-4 /標準來簡化作曲家自動加載。 –

回答

1

我可以使用SocialUpload類的對象訪問FacebookUpload或YoutubeUpload類的upload()嗎?

號簡單地說,SocialUpload不是FacebookUploadYoutubeUpload。如果一方面你有一個SocialUpload對象(你知道它是一個類型的youtube/facebook,你可以將對象轉換並轉換回它的原始類型)。否則,你必須創建一個新的對象,您的原始對象創建一個FacebookUploadYoutubeUpload。 A FacebookUpload另一方面,是一種SocialUpload。你可以從一個轉換到另一個,並訪問這兩個類的公共方法。

0

我可以使用SocialUpload類的對象訪問FacebookUpload或YoutubeUpload類的upload()嗎?

您的SocialUpload不知道子類的方法upload()。解決方案是使用抽象方法上傳來製作SocialUpload抽象,這是在具體的Facebook/YoutubeUpload類中實現的。

FYI,這個問題的答案有一個很好的例子:PHP: How to call function of a child class from parent class

0

對於第一個問題:你爲什麼要這麼做?我的建議是考慮SocialUpload抽象類和另外兩個FacebookUpload和YoutubeUpload,以及特定的類。在正確的用例中,您不應該實例化SocialUpload,而應該使用特定的元素。它就像所有PHP編程教程中的動物和狗類。

對於你應該把你的composer.json文件中以下行的第二個問題:

"autoload": { 
    "psr-4": { 
     "YOUR_NAMESPACE": "SOURCE_FOLDER/" 
    } 
    }, 
+0

我的第一個問題是第二個問題。我想只使用一個名稱空間並調用其中的所有類。可能是我錯了。我可以在同一個命名空間下分組不同的類。所以我需要只包含一個'use namespace'語句並創建任何類的對象,如$ obj = new FacebookUpload()或$ obj = new \ SocialUpload \ FacebookUpload()' –

+0

好吧,這意味着這些作曲家的作品應該可以做 – Greece

+0

的工作,因爲未來可能會添加更多類似的功能相似的類文件,而且我不想爲所有文件添加額外的'use'語句 –

相關問題