0

このクラスでは、return を echo に変更しても空白の出力が返されます。問題が何であるかはわかりませんが、明らかにクラスとオブジェクトの扱いに精通していません。

変数/配列を誤って処理しているだけだと確信していますがClass、人が作成された場合にのみ返される必要があるため、変数を宣言すべきではない可能性があります。$args関数で変数を宣言する必要がありますか、それともで処理する必要があるため、まったく宣言しないでください。

更新された質問: FIRSTNAME だけでなく、すべての引数を返すようにするにはどうすればよいですか?

PHP:

class people_handler
{
    public $firstname;
    public $middlename;
    public $lastname;
    public $city;
    public $province_state;
    /* zip+4 is default for postcode (postal code) */
    public $postcode;
    public $country;

    function create_people($args)
    {
        $fullname=array($this->firstname,$this->middlename,$this->lastname);
        $normname=array($this->firstname,$this->lastname);
        $fulladdress=array($this->city,$this->province_state,$this->postcode,$this->country);
        if(!$args->middlename&&$args->firstname && $args->lastname && $args->city && $args->province_state && $args->postcode && $args->country)
        {
            $temp_arr=array($normname,$fulladdress);
            foreach($temp_arr as $value)
            {
                foreach($value as $values)
                {
                    return $values;
                }
            }
        }
        else if($args->firstname && $args->middlename && $args->lastname && $args->city && $args->province_state && $args->postcode && $args->country)
        {
            $temp_arr=array($fullname,$fulladdress);
            foreach($temp_arr as $value)
            {
                foreach($value as $values)
                {
                    return $values;
                }
            }
        }
        else
        {
            die ("Must enter all values excluding middlename.");
        }
    }
}

$p1=new people_handler;
$p1->firstname="John";
$p1->middlename="Jonah";
$p1->lastname="Jameson";
$p1->city="Lansing";
$p1->province_state="Michigan";
$p1->postcode="48876-4444";
$p1->country="USA";


echo $p1->create_people($p1);

戻り値:

John
4

3 に答える 3

3

オブジェクトの自己参照が欠落しています$this。いたるところにあります。

クラス内からメソッドまたはプロパティを参照するときはいつでも、プロセスを実行しているオブジェクトの現在のインスタンス化として $this を参照する必要があります。では、例えば…

$fullname=array($firstname,$middlename,$lastname);  

になる

 $fullname=array($this->firstname,$this->middlename,$this->lastname);  

これらのプロパティにはすでに値を割り当てているので、どちらが機能するはずです。

編集: コードをさらに見てみると、ループを介して常に値を返すと、ブラウザーへのエコーが管理されません。echo $valueそれを返す代わりに、または値から配列を構築してそれを返し、スクリプトに配列を処理させてブラウザーにエコーさせることができます。

2 番目の編集: すべての値を取得するには、それらを構築するときにそれらを収集する必要があります。もう 1 つのオプションは、メソッドの一部として単純にブラウザに出力することです。どちらのオプションも機能しますが、それらを配列にまとめると移植性が向上しますが、維持するコードもかなり多くなります。同様に、メソッドを機能させるためにオブジェクトをそれ自体に渡す必要はありません。

echo $p1->create_people($p1);

する必要があります...

$p1->create_people();

あなたcreate_peopleが持っているでしょう...

function create_people()
{
    $fullname=array($this->firstname,$this->middlename,$this->lastname);
    $normname=array($this->firstname,$this->lastname);
    $fulladdress=array($this->city, $this->province_state, $this->postcode, $this->country);
    if($args->firstname && $args->lastname && $args->city && $args->province_state && $args->postcode && $args->country)
    { //Don't bother including middlename if it doesn't matter if it is filled or not...
        $temp_arr = array($normname, $fulladdress);
        foreach($temp_arr as $value)
        {
            foreach($value as $values)
            {
                echo $values;
            }
        }
    } else {
        die ("Must enter all values excluding middlename.");
    }
}

それはうまくいくはずです。

于 2012-04-26T17:26:31.780 に答える
2

自己参照の問題は別として (ところで、$argsこれは自己参照である必要があるため、これも必要ありません)、ループ構造が間違っています。

$temp_arr=array($normname,$fulladdress);
foreach($temp_arr as $value)
{
   foreach($value as $values)
   {
       return $values;
   }
}

この意志:

  1. temp_arr をループし、最初の値として $normname を見つけます
  2. $normname を配列として扱い、それをループします
  3. $normname で最初に見つかった値を返します
  4. これで関数が終了し、他のすべては実行されません。

関数は戻り値を1 つだけ持つことができます。複数の情報を返す必要がある場合は、すべてを 1 つの要素にまとめるために、配列またはオブジェクトとして返す必要があります。

現時点では、あなたがクラスで何を達成しようとしているのかわからないため、残念ながら、あなたが何をする必要があるかについてお手伝いすることはできません.

編集: その場合、何も返す必要はありません。クラスは、クラス内のすべての関数がこれらの変数にアクセスできるようにします。「new」を使用して、オブジェクトのインスタンスを作成します。つまり、「people_handler」を作成します。この people_handler には、公開したプロパティがあり、クラスの外部から設定できます (より大きなプロジェクトでは良いアイデアではないかもしれませんが、これには適しているようです)。クラスの一部 (つまり、その内部) であるすべての関数は、自己参照を使用して、特定の people_handler に対してこれらのプロパティが現在持っている値にアクセスできます$this

class TestClass {
    public fullname; //a random "property"
    function echoFullname() {
        echo $this->fullname; //whatever fullname is at the moment for the TestClass object we are using
    }
}

$a = new TestClass(); //Create a TestClass object
$a->fullname = "Alex"; //make its name "Alex"

$b = new TestClass(); //Create another TestClass object
$b->fullname = "Carl"; //but let's name him Carl

$a->echoFullname(); //And now output the names
$b->echoFullname();

明らかにこれは実用的ではありませんが、うまくいけばそれがどのように機能するかを示しています。ご覧のとおり、変数の受け渡しはまったく必要ありませんでした。

于 2012-04-26T17:31:42.890 に答える
1

14行目:

    $fullname=array($firstname,$middlename,$lastname);

おそらく次のようになります。

    $fullname=array($this->firstname,$this->middlename,$this->lastname);

同じ1行16:

    $fulladdress=array($city,$province_state,$postcode,$country);
于 2012-04-26T17:27:40.473 に答える