Php 如何从主作用域中的子LSS获取受保护的静态值
如何在主作用域中将值作为受保护的ststic属性从子类获取。 我在这些行中使用,但不起作用Php 如何从主作用域中的子LSS获取受保护的静态值,php,oop,static,Php,Oop,Static,如何在主作用域中将值作为受保护的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
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();
?>
请参见
从PHP5.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";
看
从PHP5.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";
[编辑]早餐后,我意识到在我正在开发的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();
?>
新的产出:
new B : are created :
new C : are created :
selected Database Table name: Table_shape_B
selected Database Table name: Table_shape_C
我真的要感谢海报提出了这么一个有趣的问题。希望这能有所帮助。[EDIT]早餐后,我意识到在我正在开发的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();
?>
新的产出:
new B : are created :
new C : are created :
selected Database Table name: Table_shape_B
selected Database Table name: Table_shape_C
我真的要感谢海报提出了这么一个有趣的问题。希望这有帮助。但是为什么需要静态变量呢
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";
}
但是为什么需要静态变量呢
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";
}
(!)致命错误:访问未声明的静态属性:Class_A::$table_name即使调试器出错,我也表示歉意代码在浏览器上运行。。谢谢(!)致命错误:访问未声明的静态属性:Class_A::$table_name即使调试器出错,我也表示歉意代码在浏览器上运行。。谢谢