0

メインスコープの保護されたststic属性として子クラスから値を取得するにはどうすればよいですか。私はこれらの行で使用しますが、機能しません。

self::$table_name="Table_shape_B";
self::$table_name="Table_shape_C";

これらの行を見たいですありがとう。

selected Database Table name: Table_shape_B
selected Database Table name: Table_shape_C

出力は

new B : are created :
new C : are created :
selected Database Table name:
selected Database Table name:

ここに私のコード:

<?php
    abstract class Class_A {

      protected static $table_name;
         //Class_B Database Table name =  "Table_shape_B"
         //Class_CA Database Table name =  "Table_shape_C"
        public function __construct()   {
            echo "<br />"." new ".get_class($this)." : are created :";
        }

        public function get_table_name_protected() {
            return self::$table_name;
        }
    }

    class B extends Class_A {
        //self::$table_name="Table_shape_B";
    }

    class C extends Class_A     {
     //self::$table_name="Table_shape_C";
    }

    $NewObject1= new B ( );
    $NewObject2= new C ( );

    echo "<br />".' selected Database Table name: '.$NewObject1->get_table_name_protected();
    echo "<br />".' selected Database Table name: '.$NewObject2->get_table_name_protected();

 ?>
4

3 に答える 3

2

http://docs.php.net/language.oop5.late-static-bindingsを参照してください

PHP 5.3.0以降、PHPは、静的継承のコンテキストで呼び出されたクラスを参照するために使用できるレイト静的バインディングと呼ばれる機能を実装しています。[...]「遅延バインディング」は、static ::がメソッドが定義されているクラスを使用して解決されるのではなく、実行時情報を使用して計算されるという事実に由来します。静的メソッド呼び出しに使用できるため、「静的バインディング」とも呼ばれます(ただし、これに限定されません)。

残念ながら、抽象メンバーメソッドの場合のように、サブクラスにこの静的メンバーを定義するように「強制」することはできません。

<?php
abstract class Class_A {

    public function __construct()   {
        echo get_class($this), "\n";
    }

    public function get_table_name_protected() {
        return static::$table_name;
    }
}

class B extends Class_A {
    protected static $table_name="Table_shape_B";
}

class C extends Class_A     {
    protected static $table_name="Table_shape_C";
}

$NewObject1= new B ( );
$NewObject2= new C ( );

echo $NewObject1->get_table_name_protected(), "\n";
echo $NewObject2->get_table_name_protected(), "\n";

プリント

B
C
Table_shape_B
Table_shape_C
于 2012-05-08T06:37:02.613 に答える
1

[編集]朝食後、私が取り組んでいるCMSでこのコードがいかにクールであるかを実感しました。そして、アレイを利用して完成させました。

<?php

error_reporting(E_ALL);

abstract class Class_A {

    protected static $table_name = array();

    public function __construct()   {
        $tmp = get_class($this);
        echo "<br />"." new ".$tmp." : are created :";
        self::$table_name[$tmp] = "Table_shape_" . $tmp;
    }

    public function get_table_name_protected() {
        $tmp = get_class($this);
        return self::$table_name[$tmp];
    }
}

class B extends Class_A {

}

class C extends Class_A {

}

$NewObject1= new B( );

$NewObject2= new C( );

echo "<br />".' selected Database Table name: '.$NewObject1->get_table_name_protected();

echo "<br />".' selected Database Table name: '.$NewObject2->get_table_name_protected();

?>

一度に1つずつ実行される古い出力:

 new B : are created :
 selected Database Table name: Table_shape_B
 new C : are created :
 selected Database Table name: Table_shape_C

新しい出力:

 new B : are created :
 new C : are created :
 selected Database Table name: Table_shape_B
 selected Database Table name: Table_shape_C

このような興味深い質問をしてくれたポスターに本当に感謝しなければなりません。お役に立てれば。

于 2012-05-08T06:57:04.833 に答える
0

しかし、なぜそのために静的変数が必要なのですか?

abstract class Class_A
{

    /**
    * Hold table name
    * @var string
    */
    protected $table_name = null;

    /**
    * Get protected table name
    * @return string
    * @throws RuntimeException
    */
    public function get_table_name_protected()
    {
        if (null === $this->table_name) {
            throw new RuntimeException('Table name is not defined');
        }
        return $this->table_name;
    }
}

class Class_B extends Class_A
{
    protected $table_name = "Table_shape_B";
}

class Class_C extends Class_B
{
    protected $table_name = "Table_shape_C";
}
于 2012-05-08T07:24:49.063 に答える