2

でアクションをインターセプトする方法を探しています。これは、アクションarray_pushが取得されるときに、配列の各値に次のような別の情報があるためです。

class ClassName {

    var $test = array();

    function __set($attr, $value) {
      $this->$attr = 'My extra value'.$value;
    }    

    function index(){
      array_push($this->test, "some val");
      array_push($this->test, "some other val");

      print_r($this->test);

    }
}

$o = new ClassName();
$o->index();

そして、次のようなものを取得することが期待されます:

Array
(
    [0] => My extra value some val
    [1] => My extra value some other val
)

しかし、私は得る:

Array
(
    [0] => some val
    [1] => some other val
)

ありがとうございます

4

5 に答える 5

2

配列を使用する代わりに、ArrayAccess インターフェイスを実装するクラスを使用できます。このようにして、配列に追加するときに何が起こるかを完全に制御できます。

http://php.net/manual/en/class.arrayaccess.php

欠点は、すべての配列関数がオブジェクトで機能するわけではないことです (つまり、並べ替えなど) が、次のようにプッシュできます。

$object[] = 'new value';

別の方法は、配列に追加するためのラッパー関数を単純に作成することです。

public function addToArray($key, $value) {
   if ($key === null) {
      $this->test[] = 'My extra value ' . $value;
   } else {
      $this->test[$key] = 'My extra value ' . $value;
   }
}
于 2012-04-10T18:23:41.523 に答える
0

PHPマニュアルから:

__set() is run when writing data to inaccessible properties.
__get() is utilized for reading data from inaccessible properties.

これは、アクセスできないプロパティの読み取り/書き込みでのみ呼び出されます。ただし、プロパティは公開されているため、アクセス可能です。アクセス修飾子を保護に変更すると、問題が解決します。

これを試して:

    class ClassName {

        private $test = array();

        public function __set($attr, $value) {
          $this->test[$attr] = $value;

        }    

        public function __get($attr) {
        return $this->test[$attr];
        }    

        public function index(){

          array_push($this->test, "some val");
          array_push($this->test, "some other val");

          return $this->test;

        }
    }

    $o = new ClassName();
    $o->setData = 'My extra value';
    print_r($o->index());
于 2012-04-10T19:04:48.820 に答える
0

あなたが何を求めているのか完全には理解できませんが、これをやろうとしていますか?

$this->test['key'] = "some val";

これにより、独自の出力を適切にセットアップできます。array_push() は別のネストされたレベルでスローするためです。

更新:おそらくこれらの線に沿ったものですか?

function push($prefix)
{
    $refl = new ReflectionClass($this);
    $prop = $refl->getProperties();
    foreach($prop as $p) {
        $this->{$p} = $prefix . $this->{$p};
    }
}
于 2012-04-10T18:10:23.353 に答える
0

PHP のマニュアルには、マジック メソッドについて次のように書かれています。

__set() は、アクセスできないプロパティにデータを書き込むときに実行されます。(私のものを強調)

testプロパティはメソッド内にあり、それにアクセスする関数はメソッド内にあるため、関数は変数を直接参照し、マジック セッターを使用しません。

さらに、クラス自体のにあるマジック セッターで array_push を使用しようとしても、それは機能しません。エラーが発生しますarray_push() expects parameter 1 to be array, object given

array_push をサポートしたい場合は、独自のpush($item)メソッドを作成する必要があります。

function push($item) {
    $this->test[] = 'My extra value' . $item
}

また:

function push() {
    $items = func_get_args();

    // Using array_map is one of the many ways to do this.
    // You could also do it with a simpler `foreach` but I like this way.
    $prepend = function($item) {
        return 'My extra value' . $item;
    };
    $items = array_map($prepend, $items);
    array_push($this->test, $items);
}

一度に複数のアイテムをプッシュすることをサポートしたい場合。

于 2012-12-19T20:15:37.660 に答える
0

あなたが探しているものを達成するために、その用途に関係なく値をプレフィックスする関数を自分で作成することをお勧めします:

function prefix($value) {
    return 'My extra value '.$value;
}

その後、関数内でその関数を利用できindex()ます。

function index()
{
    $test = array("some val", "some other val");
    foreach($test as $value)
    {
        $this->test[] = $this->prefix($value);
    }
    print_r($this->test);
}
于 2012-04-10T18:22:49.777 に答える