3

PHPでフレームワークを作っています。library/core.phpにインポート機能があります。

私はこのような関数を使うことができます:

$core->import("someclass");

これは機能です:

public function import()
    {
        $import_resources = func_get_args();

        $check_directories = array("library", "template", "view", "action", "errors");

        $instances = array();

        foreach($import_resources as $resource)
        {
            for($i = 0; $i <= count($check_directories) - 1; $i++)
            {
                if(file_exists($this->appRoot() . $check_directories[$i] . "/" . $resource . ".php"))
                {

                    $classes = get_declared_classes();
                    include ($check_directories[$i] . "/" . $resource . ".php");
                    $included_classes = array_diff(get_declared_classes(), $classes);
                    $last_class = end($included_classes);

                    $last_class_lowercase = strtolower($last_class);

                    $this->$last_class_lowercase = new $last_class(); 
                    // create an instance of the included class and attach it to the Core Class

                }

                else
                {

                }   
            }
        }

    }

したがって、他のクラスでは、次のように使用できます。

$core->import("view");
$core->view->get();

これの要点は、含まれているクラスが拡張されたときに、別のクラスで使用できるようにすることでした。

class Someclass extends Core
{
    public function somefunc()
    {
        $this->view->get(); // This does not work. 
    }
}

どうすればこのように機能させることができますか?これはフレームワークの非常に重要な部分です。これがフレームワークの仕組みだからです。CodeIgniterのような人気のあるフレームワークでも同様に機能すると思います。

使ってparent::view->get()みたのですが、よくわからないと思います。

それが私の仕事に私を抑えているので、私はこれを理解できることを願っています。前もって感謝します。

4

1 に答える 1

1

あなたがしたいのは、「マジックメソッド」、この特定のもの(__get()これは外部からアクセスできないプロパティを取得する)を使用することです。次のように使用します。

<?php
// --- Begin Importer.php --------------------
class Importer{
    protected $classes = array();

    public function __get($method_name){
        if(array_key_exists($method_name, $this->classes)){
            return $this->classes[$method_name];
        }
    }

    public function import($class_name){
        // Do this or use an auto loader
        require_once __DIR__ . "/../classes/$class_name";
        $this->classes[$class_name] = new $class_name();
    }
}
// --- End Importer.php ---------------------


// --- Begin MyClass.php --------------------
class MyClass{
    public function get(){
        return "hello";
    }
}
// --- End MyClass.php ----------------------


// --- Where ever you call Importer ---------
$importer = new Importer();
$importer->import("MyClass");


echo $importer->MyClass->get();
于 2012-12-28T19:34:14.490 に答える