1

class の属性にBアクセスする機能をclass に付与したいと考えています。私はどちらも作成したくないし、関数を介してその内容を公開したくないことに注意することが重要です。アクセスできる唯一のクラスはとです。protectedxAxpublicgetterA->xAB

<?php
class A
{
    protected $x = 'some content';
}

class B
{
    protected $a;

    public function __construct(A $a)
    {
        $this->a = $a;
    }

    public function print_x()
    {
        print '???';
    }
}

$b = new B(new A());
$b->print_x();

これを達成するための解決策を探しています。

4

3 に答える 3

2

class が class を拡張する場合、 Classはクラスの保護されたメンバーBにアクセスできます。子クラスは、親クラスの保護されたメンバーにアクセスできます。子クラスは、親クラスのメソッドをオーバーライドすることもできます。ABA

あるクラスが別のクラスの機能を拡張する場合、継承 (親子関係)を使用します。たとえば、 classは classsquareを拡張できrectangleます。クラスsquareには、クラスのすべてのプロパティと機能にrectangle加えて、クラスを a とは異なる独自のプロパティと機能がありますrectangle

classを class に渡すことで構成を実装しています。コンポジションは、あるクラス別のクラスを使用するために使用されます。たとえば、クラスはクラスを使用する場合があります。ABuserdatabase

    class A
    {
        protected $x = 'some content';
    }

    class B
    {
        protected $a;

        public function __construct(A $a)
        {
            $this->a = $a;
        }

        public function print_x()
        {
            print '???';
        }
    }

    $b = new B(new A());
    $b->print_x();

推奨される読み物: http://www.adobe.com/devnet/actionscript/learning/oop-concepts/inheritance.html

http://en.wikipedia.org/wiki/Inheritance_%28オブジェクト指向プログラミング%29

http://eflorenzano.com/blog/2008/05/04/inheritance-vs-composition/

リフレクションを使用する必要がある場合は、これを試すことができます。

class A
{
    protected $x = 'some content';
}

class B 
{
    protected $a;

    public function __construct(A $a)
    {
        $this->a = $a;
    }

    public function print_x()
    {
        $reflect = new ReflectionClass($this->a);
        $reflectionProperty = $reflect->getProperty('x');

        $reflectionProperty->setAccessible(true);

        print $reflectionProperty->getValue($this->a);

    }
}

$b = new B(new A());
$b->print_x();
于 2013-10-03T20:03:28.047 に答える
1

保護されていると宣言されたメンバーは、クラス自体内で、継承されたクラスと親クラスによってのみアクセスできます

于 2013-10-03T20:03:38.790 に答える
1

クラス A をクラス B で拡張します。

クラス A をクラス B で拡張したくない場合の代替手段は、Reflectionを使用することです。

于 2013-10-03T20:13:22.293 に答える