0

オブジェクトを作成したいのですが、私は OOP の初心者です。以下のコードを試してみると、エラー コードが返されます。

解析エラー: 25 行目の /home/acosor/work/bpideeas/branches/testing/clasa/clasa.php の構文エラー、予期しない '('、'&' または変数 (T_VARIABLE) が必要です

基本的に、構造内に関数を挿入したいのですが、その方法について頭を悩ませることはできません。

<?php

    $clasa = array(
        'e1' => array('nume' => 'Nitu', 'prenume' => 'Andrei', 'sex' => 'm', 'varsta' => 23),
        'e2' => array('nume' => 'Nae', 'prenume' => 'Ionel', 'sex' => 'm', 'varsta' => 27),
        'e3' => array('nume' => 'Noman', 'prenume' => 'Alice', 'sex' => 'f', 'varsta' => 22),
        'e4' => array('nume' => 'Geangos', 'prenume' => 'Bogdan', 'sex' => 'm', 'varsta' => 23),
        'e5' => array('nume' => 'Vasile', 'prenume' => 'Mihai', 'sex' => 'm', 'varsta' => 25)
    );

    $obj = new stdClass();
    foreach ($clasa as $key => $value) {
        $obj -> $key = $value;
    }

    class Clasa {
        function filtru($x, $a, $b) {
            foreach($x as $elev => $arr) {
                if($arr[$a] == $b) {
                    echo $arr['nume'].' '.$arr['prenume'].' '.$arr['varsta'].'<br/>';
                }//if end
            }//foreach end
        }//function end

        public function __construct(filtru($x, $a, $b)) {
            $this -> lista = $x;
            $this -> cheie = $a;
            $this -> valori = $b;
        }
    }//class end

    $z = new Clasa($clasa, 'sex', 'm');

    echo $z;

?>
4

5 に答える 5

2

通常、OOP のメソッド内に関数を含めることはありません (_construct はメソッドであり、すべての関数は php OOP でメソッドと呼ばれ、クラスのルート レベルの変数はプロパティです)。

代わりに、別のメソッドを作成し、その兄弟メソッドの 1 つから呼び出します。

Class Clasa{
    public function filtru($x, $a, $b) {
        foreach($x as $elev => $arr) {
            if($arr[$a] == $b) {
                echo $arr['nume'].' '.$arr['prenume'].' '.$arr['varsta'].'<br/>';
            }//if end
        }//foreach end
    }//function end

    public function __construct($x, $a, $b) {
        $this->filtru($x, $a, $b); // this calls the filtru method
        $this -> lista = $x;
        $this -> cheie = $a;
        $this -> valori = $b;
    }   
}

" $this" は、現在のインスタンスのメソッドまたはプロパティを参照するために使用されます。いくつかのプロパティを設定するために既に使用されているようです。そのため、インスタンス内の他のメソッドを呼び出すためにも使用できます。

Google でカプセル化をチェックして、これらのメソッドを public/private/protected と宣言したときの違いを確認してください


編集: OP の要求に従って $z をエコーする方法

$zcosをエコーすることはできません。cos$zは、前に見た変数とは異なり、クラス Clasaのインスタンスを保持しています。そのため、エコーできません。通常、文字列、整数などの単一の値のみをエコーできます。たとえば、配列をエコーし​​ようとするとエラーが発生します。

じゃあどうする?のようにプロパティをエコーできますecho $z->lista。しかし、これは悪い習慣と考えられています。詳細な説明については、Stackoverflow を少し調べてください。代わりに、必要な情報を出力するメソッドと、値を返すメソッドを構築して、外部から値をエコーし​​たり、必要なことを実行したりできます。

Class Clasa{ ... //前のコード

public function showResults(){
    echo $this->lista.", ";
    echo $this->cheie.", ";
    echo $this->valori;
}

public function returnResults(){
    return "$this->lista, $this->cheie, $this->valori";
}   

}

したがって、次のことができます。

$z->showResults(); // this will automatically echo the results because there are echoes in the method;
echo $z->returnResults();//that method will return the string, so you can echo it or do whatever you want with it
于 2013-10-11T07:34:06.017 に答える
0

交換

 public function __construct(filtru($x, $a, $b))

 public function __construct($x, $a, $b)

交換

$z = new Clasa($clasa, 'sex', 'm');
echo $z;

$z = new Clasa($clasa, 'sex', 'm');
echo $z->filtru($clasa, 'sex', 'm');
于 2013-10-11T07:32:15.583 に答える
0

filtru()コンストラクターで呼び出したい場合は、試してください

public function __construct($x, $a, $b){
  $this->filtru($x, $a, $b); 
}
于 2013-10-11T07:32:17.610 に答える