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 中都称为方法,类根级别中的变量是属性)

相反,您创建另一个方法并从它的一个兄弟方法中调用它:

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$z不像你以前见过的变量,它持有Class 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 回答
1

不要做

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

但使用

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

反而。

于 2013-10-11T07:28:27.323 回答
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 回答
0

你想这样做吗..?

public function __construct($x,$a,$b) {
            filtru($x, $a, $b);
            $this -> lista = $x;
            $this -> cheie = $a;
            $this -> valori = $b;
        }
于 2013-10-11T07:33:03.717 回答