扩展类和受保护的数据

3

我正在尝试创建一个用于管理小部件的类。在父类中,我遇到了受保护数据的问题:

Widget.php

/** Parent class **/
class Widget{
    protected $html =""; //formated html data
    // method to load views in {system_path}/widgets/{widget_name}/views/
    protected function LoadView($filename){
        if(!empty($filename) && is_string($filename)){
            $output = "";
            $dir = WIDGET_PATH . "views" . DS . $filename;
            ob_start();
                include($dir);
                $output = ob_get_contents();
            ob_end_clean();
            return $output;
        }
        return NULL;
    }

    //method to render formated html data
    public function Render(){
        if(isset($this->html) && !empty($this->html)){
            return $this->html;
        }
        return NULL;
    }
    //static method to load a Widget
    public static function Load($widgetName){
        if(!empty($widgetName) && is_string($widgetName)){
            $widgetName = strtolower($widgetName);
            if(file_exists(WIDGET_PATH . $widgetName . DS . $widgetName . ".php")){
                include_once(WIDGET_PATH . $widgetName . DS . $widgetName . ".php");
                if(class_exists($widgetName."_Widget")){
                    $class = $widgetName."_Widget";
                    return new $class();
                }
            }
        }
        return FALSE;
    }

}

/widgets/socialbar.php

/** SocialBar Widget **/
class Socialbar_Widget extends Widget
{   
    public function __construct(){
        $this->html = "demo"; // test to see if it works
    }
}

index.php

/*load class files, etc */
$Social = Widget::Load("socialbar"); //works, perfectly loads Socialbar_Widget()

var_dump($social); // works : object(Socialbar_Widget)[29] protected html = 'demo' ......

$Social->Render(); // throws Fatal error: Using $this when not in object context

我应该使用“public”来扩展父类中的变量吗?还是我搞错了什么。 感谢大家的帮助。

1
“在非对象上下文中使用 $this” 源于以静态方式调用非静态方法。看起来这里还有其他的问题要解决。您能否尝试提供一个简短、自包含示例,以演示您的问题? - cmbuckley
3
我复制了你的代码并尝试了一下,我的Render方法完美地运行了。我似乎找不到你的代码中的问题。 - flec
1
@StefanLuv,您在此发布的代码不会(实际上也不能)生成您发布的错误。上面的代码也不是自包含的,因为其中的“WIDGET_PATH”和“DS”没有定义(尽管我们可以推断它们的含义)。请尝试启用“E_STRICT”错误,因为这将给您提供类似于“不应静态调用非静态方法ClassName :: FunctionName()”的内容。 - cmbuckley
2
当您var_dump $social时,它不应该给出protected html ='demo'而不是protected html =''吗?似乎这里还有其他问题。 - Supericy
@StefanLuv 任何 PHP 5 版本都应该可以很好地运行这个程序。请注意,在 PHP < 5.4.0 中,E_STRICT 不是 E_ALL 的一部分。@supericy 的评论非常有趣,如果确实是正确的 var_dump 输出,那么值得一看。 - cmbuckley
显示剩余7条评论
1个回答

1
你的类名是 Socialbar_Widget, 你以小写字母调用它。
$Social = Widget::Load("socialbar")

在load方法中,你正在使用strtolower($widgetName)。
检查类文件名.php。load函数可能会返回false。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接