我需要你的指导,可能是一个非常基本的问题,但即使经过大量的谷歌搜索,我也无法弄清楚这一点。我可以通过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;调用方法没有任何错误。
答案 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
更为有限。如果是相反的话。