-1

オブジェクト指向の PHP は初めてです。練習用のコードを書いたところですが、次のようなエラーが表示されます

Notice: Undefined variable: type in F:\xampp\htdocs\testing\scope.php on line 10
Notice: Undefined index: in F:\xampp\htdocs\testing\scope.php on line 10

$typeこのエラーが発生しているためだと思います。誰か助けてくれませんか?前もって感謝します。

class Lookup {
    public static $items = array();
    public $x = '34';
    public $y = '26';

    public static function setItems($items, $x, $y) {
        $items[$type] = array(
                'x' => $this->x,
                'y' => $this->y);
    }

    public static function getSum() {
        $z = self::$items[$type]['x'] + self::$items[$type]['y'];
        return $z;
    }
}

echo Lookup::getSum();
4

2 に答える 2

4

あなたのコードにはいくつかの矛盾があります。

setItems()

  • と の2 つのパラメータが$xあり$y、これらは使用されません。
  • メソッド本体$typeが未定義の変数を参照しています。
  • メソッドは$thisキーワードを使用しますが、これは静的メソッド内では使用できません (オブジェクト コンテキストがありません)。

getSum()

  • あなたがすでに知っているように、$typeは存在しません。パラメータとして渡すつもりでしたか?

未定義変数の問題は OOP に直接関係していませんが、パラダイムをよく理解していないことがわかります。の PHP ドキュメントを参照してくださいClasses and Objects

于 2013-10-13T14:28:20.017 に答える
2

クラスのプロパティまたはメソッドを static として宣言すると、クラスのインスタンス化を必要とせずにアクセスできるようになります。静的として宣言されたプロパティは、インスタンス化されたクラス オブジェクトではアクセスできません (ただし、静的メソッドはアクセスできます)。

PHP 4 との互換性のために、可視性の宣言が使用されていない場合、プロパティまたはメソッドは public として宣言されているかのように扱われます。

静的メソッドは作成されたオブジェクトのインスタンスなしで呼び出すことができるため、疑似変数 $this は static として宣言されたメソッド内では使用できません。 php.org から

そのための 1 つの解決策は、すべてを静的にすることです (この方法Lookup::getSum()では、クラスのインスタンス化なしで呼び出すことができます)。

class Lookup{
  public static $items = array();
  public static $x = '11114';
  public static $y = '26';
  public static function setItems(){
    self::$items = array('x'=>self::$x ,'y'=>self::$y);
  }
  public static function getSum(){

    $z = self::$items['x'] + self::$items['y'];
    return $z;
  }
}
echo  Lookup::setItems();
echo  Lookup::getSum();

あなたの方法がうまくいかなかった理由は、クラスメソッド内では、非静的プロパティのみが-> (オブジェクトオペレーター)によってアクセスできるためです。

$this->property (ここで、property はプロパティの名前です)。

静的プロパティには、:: (ダブル コロン) を使用してのみアクセスできます。

自己::$プロパティ

したがって、コードでは、この方法で変数にアクセスする必要があります (ただし、これは非常に悪い OO 設計であるため、推奨されません)。

class Lookup{
  public static $items = array();
  public $x = '11114';
  public $y = '26';

  public function setItems(){
    self::$items = array('x'=>$this->x ,'y'=>$this->y);
  }

  public static function getSum(){
    $z = self::$items['x'] + self::$items['y'];
    return $z;
  }

}

$a = new Lookup();
$a->setItems();

echo Lookup::getSum();
//11140
于 2013-10-13T14:31:57.513 に答える