使用php中的父类或命名空间访问继承的类

时间:2017-06-27 11:34:57

标签: php inheritance namespaces

我在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()类的对象访问FacebookUploadYoutubeUpload课程的SocialUpload吗?

另外,如何将它添加到composer autoload以使用命名空间从任何地方访问这些类?

3 个答案:

答案 0 :(得分:1)

  

我可以使用SocialUpload类的对象访问FacebookUpload或YoutubeUpload类的upload()吗?

没有。简而言之,SocialUpload不是FacebookUploadYoutubeUpload。如果你一方面有一个SocialUpload对象(而且你知道它是一个类型youtube / facebook,你可以将对象转换回原来的类型。)否则,你必须创建一个新对象,使用原始对象中的信息创建FacebookUploadYoutubeUpload。另一方面,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/"
    }
  },