3

私はPHPが初めてで、OOPを始めたばかりです。プロパティの設定と取得に使用される一般的なメソッドはほとんどありません。ほとんどすべてのクラスで頻繁に使用します。これらのメソッドをクラスに入れ、そこから他のクラスを拡張します。これで、子クラスからメソッドにアクセスできますが、それらを介して子クラスの属性を設定および取得する方法がわかりません...親クラスbase.php

class Base
{
    public function __construct()
    {
    }

    function __set($propName, $propValue)
    {
        $this->$propName = $propValue;
    }

    function setProperties(array $data)
    {
        foreach($data as $propName => $propValue)
            $this->$propName = $propValue;
    }

    function __get($propName)
    {
        return (isset($this->$propName))? $this->$propName : "Invalid property!";
    }

    function getProperties(array $properties)
    {
        foreach($properties as $propName)
            $propVals[$propName] = $this->$propName;
        return $propVals;
    }
}

子クラスのcategories.php

class categories extends Base
{

    private $id;
    private $pid;
    private $title;
    private $status;

    public function __construct()
    {
        parent::__construct();  
    }
}

そして、私はそれを次のように呼びました

$objCat = new categories();

$objCat->setProperties(array('id'=>'10', 'pid'=>'6'));

print_r( $objCat->getProperties(array('id', 'pid')));

ここでは少しガイドが必要です。それが正しい方法なら?または、少なくともこのようにすることは可能ですか?もしそうなら、これを達成する方法...ありがとう

4

1 に答える 1

6

categoriesクラスの拡張は、クラスがクラスであると言える場合にのみ行いたいことですBase。あなたが持っているそのようなユーティリティクラスのようなものは、ほとんどの場合間違った方法です。PHP はまた、コピー/ペースト コードのトレイトと呼ばれるものを導入しました。しかし、私の個人的な好みは、あなたが避けたいものであるあなたのクラスに特性を密接に結びつけるので、あなたが決して使いたくないものだということです.

詳細については、 SOLID プログラミングにおけるリスコフ置換の原則を参照してください。

それが私次第だった場合、私はそれらの魔法のゲッター/セッターをどちらの方法でも避け、独自のゲッター/セッターメソッドをクラスに追加するだけです。

一部の基本クラスに関する間違いは、あなただけがしていることではありません (過去に私がやったことがあります)。Databaseいくつかのクラスとクラスについて考えてくださいArticle。クラスはデータベースにアクセスする必要があるため、Article多くの人がクラスにクラスを拡張させますDatabase。記事はデータベースではないため、これは正しくありません。代わりに、依存性注入を使用して、データベース クラスのインスタンスをアーティクル クラスに注入する必要があります。インスタンスは、(すべてまたは多くのメソッドがそれにアクセスする必要がある場合) クラス コンストラクターに注入するか、それを必要とするメソッドだけに注入する必要があります。したがって、クラスを拡張するときは、クラス B がクラス A であると言えなければなりません。

コードに関するその他の注意事項:

  • クラス名は常に PascalCase にしてください。これは、コードを機能させるために実際に必要なわけではありませんが、よく使用される命名規則に従います。
  • 個人的な好みとしては、foreach ステートメントには常に中かっこを追加してください。他の人があなたのコードを読んでいるときに何が起こっているかがより明確になります。
于 2012-08-15T07:53:44.233 に答える