【问题标题】:access inherited classes using parent class or namespace in php使用 php 中的父类或命名空间访问继承的类
【发布时间】:2017-07-03 15:02:17
【问题描述】:

我正在学习 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 类的对象访问FacebookUploadYoutubeUpload 类的upload() 吗?

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

【问题讨论】:

标签: php inheritance namespaces


【解决方案1】:

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

没有。简单地说,SocialUpload 不是FacebookUploadYoutubeUpload。如果您一方面有一个 SocialUpload 对象(并且您知道它属于 youtube/facebook 类型,您可以将该对象强制转换并转换回它的原始类型。)否则,您必须创建一个新对象,使用来自原始对象的信息以创建 FacebookUploadYoutubeUpload。另一方面,FacebookUploadSocialUpload 的一种类型。您可以从一个转换到另一个,并访问两个类的公共方法。

【讨论】:

    【解决方案2】:

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

    您的 SocialUpload 不知道子类的方法 upload()。一种解决方案是使用抽象方法上传使 SocialUpload 抽象,该方法在具体的 Facebook/YoutubeUpload 类中实现。

    仅供参考,这个问题的答案有一个很好的例子:PHP: How to call function of a child class from parent class

    【讨论】:

      【解决方案3】:

      对于第一个问题:为什么要这样做?我的建议是考虑 SocialUpload 一个抽象类和另外两个,FacebookUpload 和 YoutubeUpload,使用特定的类。在正确的用例中,您不应实例化 SocialUpload,而应使用特定元素。就像所有 PHP 编程教程中的 Animal 和 Dog 类一样。

      对于第二个问题,您应该在您的 composer.json 文件中添加以下几行:

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

      【讨论】:

      • 我的第一个问题是第二个问题。我只想使用一个命名空间并调用其中的所有类。可能是我错了。我可以将不同的类分组在同一个命名空间下吗?所以我只需要包含一个use namespace 语句并在其下创建任何类的对象,例如$obj = new FacebookUpload()$obj = new \SocialUpload\FacebookUpload()
      • 好的,这意味着作曲家的这些行应该完成这项工作
      • 是的,因为以后可能会添加更多类似功能的类文件,我不想为所有文件添加额外的use语句
      猜你喜欢
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2011-01-15
      • 2016-11-26
      相关资源
      最近更新 更多