在PHP中你如何创建可重用的对象?,这是最好的做法吗?你喜欢哪个?

7 php oop code-reuse object

我在php中创建了一些可重用的对象,我想知道最好的构建它们的方法.下面我有两个不同方法的例子.

Class Uploader{
    public $Filename;
    public $Directory;

    function upload(){
        upload_file($this->Filename, $this->Directory)
    }
}

// Then use the class above like this.
$u = new Uploader;
$u->Filename = 'foo.png'; // Set all the props
$u->Directory = 'bar/'    //  ^   ^   ^    ^
$u->upload();             // Then Execute
Run Code Online (Sandbox Code Playgroud)

或者这样做会更好......

Class Uploader {
    function uploader($filename, $directory){
        upload_file($filename, $directory)
    }
}

// Then use the class above like this.
$u = new Uploader;
$u->uploader('foo.png', 'bar/') // Obviously much less code, All in One.
Run Code Online (Sandbox Code Playgroud)

在这两种方法中,哪一种更受欢迎,是它们的速度差异还是使用一种方法而不是另一种方式的增益?
我赞成示例#1,但这是他们最好的做法吗?

zzz*_*Bov 7

你为什么不能两个都做?

class Uploader
{
  public
    $filename,
    $directory;

  public function __construct( $name = '', $dir = '', $autoUpload = false )
  {
    $this->filename = $name;
    $this->directory = $dir;
    if ( $autoUpload )
    {
      $this->upload()
    }
  }

  public function upload()
  {
    //check your values
    ...code...
    upload_file( $this->filename, $this->directory );
  }
}
Run Code Online (Sandbox Code Playgroud)

使用此技术,您可以使用以下命令自动上传文件:

$uploader = new Uploader( $name, $dir, true);
Run Code Online (Sandbox Code Playgroud)

或者您可以使用以下方法手动构造对象:

$uploader = new Uploader();
$uploader->filename = $name;
$uploader->directory = $dir;
$uploader->upload();
Run Code Online (Sandbox Code Playgroud)

  • @igorw,文章中描述的方式与我发布的示例完全无关.本文并不反对具有功能构造函数,它反对对象实例化的紧密耦合以及它们如何干扰测试.摘要是:"如果测试对象构造函数很困难,那么你就太复杂了". (2认同)

Dan*_*ira 6

方法一是经典的OO方法,其中您创建的对象包含数据和处理该数据的方法.方法二只是在类中创建函数的实用程序库.方法二无疑更快,但其方法中的OO较少.如果你要重复使用,我实际上会采用方法一.如果它是您想要的性能,请完全跳过使用类并编写功能库.