web-dev-qa-db-ja.com

PHPでクラスと関数を使用する場合

電球はまだこれに続いていません...

関数を使用するだけでなく、PHPでクラスを使用する利点のわかりやすい説明が本当に欲しいです。

ここに私が今持っている考えの簡単な例があり、クラスがより効率的かどうか疑問に思っています:

Phpで作成したミニカレンダーウィジェットがあるとします。関数miniCal('arrayVars1', 'var2')を呼び出すことを考えています。しかし、私はそのページで2回それをするかもしれません。ここでクラスを使用することにより、使用するリソースを減らし、その新しいインスタンスを作成しますか?

私は今、木がレンガの壁のように感じるので、私はここでtreeえるべきです.

61
jay

クラスは、データをオブジェクトとして表すために使用されます。ユーザーのデータまたはオークション入札のようなものを表す場合、UserオブジェクトまたはAuctionBidオブジェクトを作成すると、そのデータをまとめてコード内で受け渡しやすくし、読者がより簡単に理解できるようにします。これらのクラスには、属性(数値、文字列、またはその他のオブジェクトなどのデータフィールド)とメソッド(任意のクラスで操作できる関数)があります。

通常、クラスはパフォーマンスの面で利点を提供しませんが、いずれかのマイナス効果をもたらすことはほとんどありません。彼らの本当の利点は、コードを明確にすることです。

PHP5オブジェクト指向プログラミングガイドWikipedia OOP entry を読むことをお勧めします。

52
Kaleb Brasee

PHP5以降の一般的なことは、ライブラリとして機能するクラスを作成することでした。これにより、機能を整理し、__ autoload()などのクラス機能を利用できるという利点が得られます。

たとえば、データを暗号化および復号化するための2つの関数があるとします。それらをクラスにラップして(暗号化と呼びましょう)、静的関数にすることができます。その後、次のような関数を使用できます(初期化は不要です(つまり、$ obj = new Encryption)):

$encrypted_text = Encryption::encrypt($string);

そして

$decrypted_text = Encryption::decrypt($string);

これの利点は次のとおりです。

  1. 暗号化機能はグループ化され、整理されます。あなたとコードを管理している人は誰でも、暗号化機能の場所を知っています。
  2. これは非常に明確で読みやすいです。保守性に優れています。
  3. __autoload()を使用して、クラスを自動的に含めることができます。これは、組み込み関数のように使用できることを意味します。
  4. 独自のクラスと独自のファイルに含まれているため、再利用可能で、新しいプロジェクトに簡単に移植できます。
38
John Conde

クラスを使用すると、関数をグループ化できます。

違いは、プログラミングパラダイムの使用方法にあります。 O.O.Pではクラスが必要です手続き型のパラダイムでは必要ありません。手続き型のパラダイムでは、関数をファイルとしてグループ化できます。ファイルはモジュールと見なすことができます。

---編集---

手続き型パラダイムを使用できます。このパラダイムでは、クラスは実際には必要ありません。

function miniCal($string_1, $string_2){
//do something   
}

//invoke function
miniCal('arrayVars1', 'var2');

OOPパラダイムを使用できます。クラスが必要です。

class Calculation {

public static function miniCal($string_1, $string_2){
    //do something   
    }
}

//invoke function
Calculation::miniCal('arrayVars1', 'var2');

結論

両方のパラダイマの仕事ですが、上記のOOPの例は、すべての計算メソッド(関数)を含むCalculationsオブジェクトを使用しています。Calculationsオブジェクトは計算関数をグループ化し、それらを1か所に保持します。

O.O.P.この例のパラダイムは、「固体責任」と呼ばれる原則に従っています。この背後にある考え方は、コードをエレガントで保守しやすく、読みやすくすることです。

6
Julian

関数はアプリケーションの要であり、クラスはプレートのようなものです。皿なしで肉を食べるのは面倒です。しかし、肉がなければ食事はありません。

アプリケーションに500個の関数がある場合、アクセスを容易にするために、少なくともそれらの半分をより大きなコレクションにグループ化することをお勧めします。一般的な命名規則( "Encryption_Encrypt"、 "Encycryption_Decrypt"など)を考案できますが、クラスは簡単です。アプリケーションに12個の関数しかない場合、おそらく1つまたはクラス(存在する場合)だけで生き残ることができます。

クラスにデータ/プロパティを保存する必要はあまりありません。私はそれらをデータベースに保存する傾向があります。そのため、私はクラスのその側面をあまり頻繁に利用していません。

クラスでは、ポリモーフィズムも許可されます。これは役立つ場合があります。非常に似ているクラスやクラスのバリエーションがいくつかある場合、フランケンシュタインのような多目的クラスを作成することなくコードを保存できます。

4
John Doe

この質問に対する私の答えに、OOPスタイルクラスを使用する場所のリストがあります。 https://stackoverflow.com/questions/2035449/why-is-oop-hard-for-me/2035482# 2035482

基本的に、何かを含むオブジェクトを表現したいときはいつでも。一意の接続を持つデータベース変数のように。それを保存して、mysql_queryは常に正しい接続を使用します。

class MySQL extends Database
{
    public function connect($Host, $user, $pass, $database)
    {        
        $this->connection = mysql_connect($Host, $user, $pass);
        $this->select_db($database);
    }

    public function query($query)
    {
        return mysql_query($query, $this->connection);
    }

    public function select_db($database)
    {
        mysql_select_db($database);
    }    
}

または、フォームを作成する場合は、入力のリストを含むフォームオブジェクトを作成し、フォームを表示するときにフォーム内に配置することもできます。

class Form
{
    protected $inputs = array();
    public function makeInput($type, $name)
    {
         echo '<input type="'.$type.'" name="'.$name.'">';
    }

    public function addInput($type, $name)
    {
         $this->inputs[] = array("type" => $type,
                "name" => $name);
    }

    public function run()
   {
       foreach($this->inputs as $array)
       { 
          $this->makeInput($array['type'], $array['name'];
       }
    }
}

$form = new form();

$this->addInput("text", "username");
$this->addInput("text", "password");

または他の誰かが示唆したように、人:

class Person{

    public $name;
    public $job_title;
    // ... etc....

}

クラスは、名前や役職などのプロパティがあり、フォームの表示などのメソッドがある場合があるため、すべてがクラスを作成する理由です。

2
Tyler Carter

基本的には両方とも同じ作業を行いますが、クラスを使用するとコードを簡単に管理できます。クラスを使用する場合は、関数を呼び出すためのオブジェクトを作成する必要があります。オブジェクトを作成します。

0
Priyank Dadhich