4

クラスを拡張して基本 orm 関数を提供する抽象クラスがあります。それが提供するすべての関数はクラスに対して保護されているため、どのフィールドを外部オブジェクトに公開するかを決定できます。しかし最近、私はそのような複雑さを必要とせず、orm 編集機能を一般に公開し、特別な機能を持たないことで恩恵を受けるいくつかの小さなデータ クラスを扱い始めました。

関数の命名規則は十分かつコンパクトであるため、既存の関数をパブリックに変更する方法はありますか (同じクラスを必要とせずに、または暫定的に拡張する必要はありません)、またはtraits追加するために php の新しい機能を使用する必要がありますか?内部保護された関数の抽象化レイヤーとして機能する関数の公開バージョンを含む既存のクラス?

編集:

特性メソッドについては、次のように役立つと考えていました。

abstract class ORMClass {
    public function __construct($pk) {}
    protected function __get($k) {}
    protected function __set($k,$v) {}
    protected function save() {}
}

trait publicORM {
    public function __get($k) { return parent::__get($k); }
    public function __set($k,$v) { return parent::__set($k,$v); }
    public function save() { return parent::save(); }
}

class myOrm extends ORMClass {
    use publicORM;
    protected static $table = 'myTable';
}

だから私は次myOrmのように使うことができます:

$myOrm = new myOrm(1);
$myOrm->foo = 'alice'
echo $myOrm->bar;
$myOrm->save();

以下を必要とせずに:

public function __get($k) { return parent::__get($k); }
public function __set($k,$v) { return parent::__set($k,$v); }
public function save() { return parent::save(); }

クラス myOrm にリストされる

4

1 に答える 1

3

これは適切に回答されていないため、チャールズの回答を追加します。

これは、バージョン 5 以降の PHP に組み込まれている PHP のReflectionライブラリを使用して行うことができます。この特定の方法はかなりハックです。

<?php

abstract class BaseClass {
    protected function testMe() {
        echo 'I WORK!';
    }
}

class ConcreteClass extends BaseClass {
    // Class Code
}


$method = new ReflectionMethod('BaseClass', 'testMe');
$method->setAccessible(true);
$method->invoke(new ConcreteClass()); // Prints 'I WORK!'

そして、基本クラスを拡張するがパブリックメソッドを使用する暫定抽象クラスを使用するより良い方法は次のとおりです。

<?php

abstract class BaseClass {
    protected function testMe() {
        echo 'I WORK!';
    }
}

abstract class PublicBaseClass extends BaseClass {
    public function testMe() {
        parent::testMe();
    }
}

class ConcreteClass extends PublicBaseClass {
    // Class Code
}


$obj = new ConcreteClass();
$obj->testMe();
于 2013-03-13T23:03:13.143 に答える