我在php中学习命名空间。
我在vendor/anuj-tbe/social-upload
目录中创建了3个文件,树视图就像
social-upload
|- SocialUpload.php
|- Facebook
|- FacebookUpload.php
|- Youtube
|- YoutubeUpload.php
他们的内容是:
SocialUpload.php
<?php
namespace SocialUpload;
class SocialUpload {
}
实/ 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;
}
}
现在,无论何时需要,我都希望在我的应用程序中使用它。
我可以使用upload()
类的对象访问FacebookUpload
或YoutubeUpload
课程的SocialUpload
吗?
另外,如何将它添加到composer autoload以使用命名空间从任何地方访问这些类?
答案 0 :(得分:1)
我可以使用SocialUpload类的对象访问FacebookUpload或YoutubeUpload类的upload()吗?
没有。简而言之,SocialUpload
不是FacebookUpload
或YoutubeUpload
。如果你一方面有一个SocialUpload
对象(而且你知道它是一个类型youtube / facebook,你可以将对象转换回原来的类型。)否则,你必须创建一个新对象,使用原始对象中的信息创建FacebookUpload
或YoutubeUpload
。另一方面,FacebookUpload
是一种SocialUpload
。您可以从一个转换为另一个,并访问这两个类的公共方法。
答案 1 :(得分:0)
我可以使用SocialUpload类的对象访问FacebookUpload或YoutubeUpload类的upload()吗?
您的SocialUpload不知道子类的方法upload()。一个解决方案是使用抽象方法上传使SocialUpload抽象化,这是在具体的Facebook / YoutubeUpload类中实现的。
仅供参考,这个问题的答案有一个很好的例子:PHP: How to call function of a child class from parent class
答案 2 :(得分:0)
对于第一个问题:你为什么要这样做?我的建议是将SocialUpload视为一个抽象类,另外两个是FacebookUpload和YoutubeUpload,以便使用它们。在正确的用例中,您不应该实例化SocialUpload,而是使用特定元素。它就像所有PHP编程教程中的Animal and Dog类。
对于第二个问题,您应该在composer.json文件中添加以下行:
"autoload": {
"psr-4": {
"YOUR_NAMESPACE": "SOURCE_FOLDER/"
}
},