2012-03-26 8 views
1

私はftpとftps(sftpではなく)の両方で簡単なファイルアップロードを扱うクラスのセットを書いています。PHPの可変メソッド?

PHPのFTPおよびFTPSを使用しての唯一の違いは、接続関数であるので、私は$connection_function、値ftp_connect()又はftp_ssl_connect()のいずれかを有する形態$connection_function($host);、変数関数を使用することができると考えました。

どのクラスを使用するかを決める抽象クラスを作成しました。明確にするための簡素化、私は書いた:

abstract class uploader { 

    protected $connection_function; 

    public function __construct($protocol) { 
    if ($protocol == "ftp") { 
     $this->connection_function = "ftp_connect"; 
    } elseif ($protocol == "sftp") { 
     $this->connection_function = "ftp_ssl_connect"; 
    } 
    } 

    public function upload($host, $file, ...) { 
    $conn = $this->connection_function($host); 
    } 
} 

class ftp_uploader extends uploader { 
    parent::__construct("ftp"); 
} 

class ftps_uploader extends uploader { 
    parent::__construct("ftps"); 
} 

が、私はエラーを取得明らか パブリック関数のアップロードから来

PHP Fatal error: Call to undefined method ftp_uploader::connection_function()

($ホスト、$ファイル、...){ $ CONN = $ this-> connection_function($ host); }

だから、私が代わりに(私はそれがあることを期待として、あるいは治療)明らかにPHPで許可されていない変数機能の可変方法を書いたことを私に起こります。

私は何をしたいですか?抽象クラスはすべてのftp関数を扱います。私は2つのクラスにわたってコードを複製することを避けたいと思います。少し、私はちょうどたっ方法自体にプロトコルの決定を置くことができることがわかり、私はそれを見てきましたので、次に

編集

public function upload($host, $file, ...) { 

    if ($protocol == "ftp") { 
     $conn = ftp_connect($host); 
    } elseif ($protocol == "sftp") { 
     $cont = ftp_ssl_connect($host); 
    } 

    } 

しかし、それでもまだ、私は疑問に思う、方法があります私の変数メソッドを行うには?つまり、私はexpection-throwingエラー処理とそれらのifブロックの中に入れたい他のコードを複製する必要があります。

答えて

5

限り通訳は、あなたが使用しないで、その関数を呼び出すようにしようとしていることは変数としてであることを知っているよう:

public function upload($host, $file, ...) { 
    $func = $this->connection_function; 
    $conn = $func($host); 
} 

をそしてcrashspeederとしては言及:代わりに

public function upload($host, $file, ...) { 
    $conn = $this->connection_function($host); 
} 

、これを試してみてくださいcall_user_func()を使用することもできます。答えは若干変更されています:

public function upload($host, $file, ...) { 
    $conn = call_user_func_array($this->connection_function, func_get_args()); 
} 

この特定のユースケースでは、引数を簡単に渡すことができるので、これはおそらく最良の解決策です。

+1

$ this-> {$ this-> connection_function}($ host); '同じことをする別の(この場合はかなり醜い)方法です。 – AD7six

+0

...中括弧はかなり美しいと思います! – user151841

+0

@ AD7six '{}'を使う方法を見つけようとしていました。しかし、彼はクラス内の関数ではなく、ネイティブ関数を呼び出しています。 –

4

call_user_func()を使用して、必要な機能を呼び出すことをおすすめします。

public function upload($host, $file, ...) { 
    $conn = call_user_func($this->connection_function,$host, $param2, $param3); 
} 

すべてのパラメータを含む配列を渡す場合は、call_user_func_array()を使用することもできます。

関連する問題