从php中的第一类外部对象调用第二类的函数

时间:2017-11-30 11:29:35

标签: php oop dependency-injection

我需要你的指导,可能是一个非常基本的问题,但即使经过大量的谷歌搜索,我也无法弄清楚这一点。我可以通过Eureka类访问其他类的变量,但不能访问它们的函数。

这是我的情况:

index.php中的类自动加载功能

<?php
function __autoload($class_name)
{
    //$class_name = strtolower($class_name);
    $path = "{$class_name}.php";
    if (file_exists($path)) {
        include ($path);
    } else {
        die("{$path} file could not be found!<br />");
    }
}
?>

基类,我想在html页面上使用这个类的对象访问所有其他类:

<?php
    class Eureka
    {
        public $some_var1;

        public function get_all_settings()
        {
            echo 'get_all_settings was called from Eureka class.';
        }
    }
?>

timezone.php中的时区类

<?php
class TimeZone
    {
        public $some_var2;

        public function get_time_zone()
        {
            echo 'get_time_zone was called from TimeZone class.';
        }
    }
 ?>

location.php中的位置类

<?php
    class Location
    {
        public $some_var3;

        public function set_location($location_name)
        {
            echo 'set_location was called from Location class.';
        }
    }
?>

html page index.php

<?php
 $eureka = new Eureka;

    //**How can I achieve this ????**
    $eureka->TimeZone->get_time_zone();
    //**OR**
    $eureka->Location->set_location('some_location_name');       
?>

e.g。当$ eureka对象调用&#39; TimeZone&#39;类,它应该被加载和&#39; get_time_zone()&#39;调用方法没有任何错误。

1 个答案:

答案 0 :(得分:-1)

你必须做这样的事情,基本上你要将其他类存储在第一个类中然后访问它们。毕竟不能把它们从空气中拉出来。

<?php
    class Eureka
    {
        protected $someVar1; //shouldn't really use public, instead use getters and setters

        protected $TimeZone;

        //should use dependacy injection
        public function __construct(TimeZone $TimeZone = null){
               if($TimeZone) $this->setTimeZone($timezone);
        }

        public function getTimeZone(){
            return $this->TimeZone;
        }

        public function setTimeZone(TimeZone $TimeZone){
            $this->TimeZone =  $TimeZone;
        }

        public function getAllSettings()
        {
            echo 'get_all_settings was called from Eureka class.';
        }
    }

    class TimeZone
    {
        protected $someVar2;

        public function getTimeZone()
        {
            echo 'get_time_zone was called from TimeZone class.';
        }

        public function hello(){
            echo "Hello";
        }
    }


    $Eureka = new Eureka( new TimeZone() );

    $Eureka->getTimeZone()->hello();

就您的代码样式get_time_zone而言,您可以在技术上将它们命名为您想要的名称。我个人尝试遵循PSR-2标准。

您不应该使用公共属性,因为类应该是一个黑盒子,它不应该将它的实现暴露给外部世界。这将使以后更容易重构该类并进行维护。

如果打开代码的其余部分,您将在整个应用程序中搜索您使用这些属性的位置。您可以尝试与methods进行争论,但我会考虑这一点。

class Foo
{
    protected $bar;

    public function getBar()
    {
        return $this->bar;
    }
}

$Foo = new Foo;
echo $Foo->getBar();

然后,如果你重构它

class Foo
{
    protected $baz; //renamed

    public function getBar()
    {
        return $this->baz;
    }
}

//no code change requred
$Foo = new Foo;
echo $Foo->getBar();

就像你这样做

class Foo
{
    public $bar;
}

$Foo = new Foo;
echo $Foo->bar;

然后改变它

class Foo
{
    public $baz; //changed
}

$Foo = new Foo;
echo $Foo->baz; //also required changing

这是一个非常简单的小例子,但这些事情很快就会失控。并且你真的限制自己使用public大多数新手编码员看protected更为有限。如果是相反的话。

http://www.php-fig.org/psr/psr-2/