2017-11-30 13 views
-1

私はあなたの指導が必要ですが、それは非常に基本的な質問かもしれませんが、私はgoogleの検索の多くの後でもこれを把握できませんでした。私はEurekaクラスを介して他のクラスの変数にアクセスできますが、その関数はアクセスできませんでした。第1クラスの外側のオブジェクトから2番目のクラスの関数をPHPで呼び出す

これは私の場合です:

<?php 
    class Eureka 
    { 
     public $some_var1; 

     public function get_all_settings() 
     { 
      echo 'get_all_settings was called from Eureka class.'; 
     } 
    } 
?> 
: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 />"); 
    } 
} 
?> 

基底クラスで

クラスのオートロード機能、Iは、HTMLページでこのクラスのオブジェクトを使用して、他のすべてのクラスにアクセスしたいです

timezone.phpのタイムゾーンクラス

<?php 
class TimeZone 
    { 
     public $some_var2; 

     public function get_time_zone() 
     { 
      echo 'get_time_zone was called from TimeZone class.'; 
     } 
    } 
?> 
location.phpで3210の

Locationクラス

<?php 
    class Location 
    { 
     public $some_var3; 

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

htmlページのindex.phpを

<?php 
$eureka = new Eureka; 

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

例えば$ eurekaオブジェクトが 'TimeZone'クラスを呼び出すと、ロードされ、 'get_time_zone()'メソッドがエラーなく呼び出されます。

+0

新しいタイムゾーンや場所のインスタンスを作成し、プロパティとして保存するユーレカクラスのコンストラクタを変更します....'public function __construct(){$ this-> TimeZone = new TimeZone();} $ this-> Location =新しい場所(); } ' –

+0

それはどのように動作し、その依存性注入ではないです。 [__get](http://php.net/manual/en/language.oop5.magic.php)を実装することができますが、それは間違っています。 –

+0

また、魔法の '__get()'メソッドを使うこともできます –

答えて

-1

基本的には、最初のクラスに他のクラスを格納してアクセスする必要があります。結局のところ、薄い空気からそれらを引き出すことはできません。

限り、あなたのコードのスタイルとして、あなたが技術的にあなたが望むどのようにそれらに名前を付けることができ get_time_zone
<?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(); 

。私は個人的にPSR-2標準に従おうとします。

クラスはブラックボックスでなければならないため、パブリックプロパティを使用しないでください。パブリックプロパティは、実装が外部に公開されないようにする必要があります。これにより、クラスを後でリファクタリングして維持することが容易になります。

コードの残りの部分まで開くと、それらのプロパティをどこで使用しているかを調べるアプリケーション全体が検索されます。あなたはmethodsと同じ意見を述べようとすることができますが、私はこれを考えると思います。あなたはこの

class Foo 
{ 
    public $bar; 
} 

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

を行い、その後、

class Foo 
{ 
    public $baz; //changed 
} 

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

それを変更するかのようにこれは非常に単純な小さな例です

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(); 

しかし、これらのことはすぐにoを得ることができますutの手。そして、あなたは実際にはpublicを使って自分自身を制限しています。ほとんどの初心者のコーダーは、より限定的なものとしてprotectedを見ています。それは逆のときです。

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

関連する問題