2017-11-14 5 views
0

を作成しているとして、我々は次のクラス(簡体字)を持っていると仮定しますコールクラスメソッドはすぐにそれが拡張するオブジェクトが

class SuperConfig { 
    public $mainDir; 

    public function setDir() { 
     $this->mainDir = "path/to/dir"; 
    } 
} 

このクラスは、プロジェクト内の他のすべてのクラスで拡張されることになって、そしてIれます親のsetDir()機能を実行する必要があります。もちろん、私はこのようにそれを行うことができます:

class A extends SuperConfig() { 
    public function __construct() { 
     parent::setDir(); 
    } 
    // ... other stuff is about to be done ... 
} 

と私はこのような子クラスにプロパティにアクセスできます。

class A extends SuperConfig { 
    public function doSomething() { 
     SuperConfig::mainDir; 
    } 
} 

これは実行可能なソリューションですが、私はクラスの複数の数百を持って、 1人ひとりでこれをやっているのは退屈なようです。したがって、このような何かをする方法があります:

明らか
class SuperConfig { 
    public $mainDir; 

    public function __extend() { 
     $this->setDir(); 
    } 

    public function setDir() { 
     $this->mainDir = "path/to/dir"; 
    } 
} 

__extend()がそのように動作しませんが、私は思ったんだけど、私はこの作品を作ることができるかのトリックがあります。

答えて

2
class SuperConfig { 
    public $mainDir; 

    public function __construct() { 
     $this->setDir(); // consider moving setDir's code here as well, 
          // unless you have a good reason for it to be a method 
    } 

    public function setDir() { 
     $this->mainDir = "path/to/dir"; 
    } 
} 

は、あなたは、単にこれを実行した後、あなたは彼らが、コンストラクタをオーバーライドしている場合は、親のコンストラクタを呼び出すためにすべてのサブクラスを期待する:それは子供たちが親を呼び出すことを期待することは完全に合理的だ

public function __construct() { 
    parent::__construct(); 
    // more code 
} 

をそれらが意図的にインスタンスを未知かつ潜在的に壊れた状態にしておきたい場合を除いて、コンストラクタです。

+0

ええと、親のコンストラクタを直接呼び出すことについては考えていませんでした。私が求めていた解決策ではなく、確かに私が思いついた解決策よりも優れていました。どうもありがとう。 :)ああ、 'setDir()'は実際には大きかったし、コンストラクタももっとやっている。ですから、コードを読みやすくするために、別の方法では優れていますが、問題を単純化するために、私はちょうど設定のミニバージョンを作成しました。 –

1

拡張されているクラスにコンストラクタを配置します。 SuperConfigを拡張するすべてのクラスで

class SuperConfig { 
    public $mainDir; 

    public function __construct() { 
     $this->setDir(); 
    } 

    public function setDir() { 
     $this->mainDir = "path/to/dir"; 
    } 
} 

彼らはまた、コンストラクタを持っている場合、setDirが呼び出されるようにparent::__construct();を含めるようにしてください。

0

さて、この特定のケースで、あなただけの必要があります:あなたの問題への実際の解決のための

class SuperConfig { 
    public $mainDir = "path/to/dir"; 
} 
+0

私がここに示したクラスは、問題を表示するためのものでした。実際のクラス 'setDir()'は 'reconfigure()'と呼ばれ、19のプロパティを設定し、5つのメソッドを呼び出します。だから、そのようなプロパティはハードコードされた文字列ではないので、私はそのようにすることはできません。 –

1

読むのdecezeの答えを。

私は、プロジェクトのすべてのクラスをConfigクラスから拡張するべきではないことを指摘したいと思います。それを改善する方法はいくつかあります。

1)あなたは、単に創造

の必要性
class SuperConfig { 
    protected static $mainDir = null; 

    public static function setMainDir($dir) { 
     self::$mainDir = $dir; 
    } 
} 

2.なしでどこでも呼び出すことができる静的な設定クラスを作成します)はというし、子育てのクラスを形質を作成します。

あなたは、あなたのクラス内で使用することができます
trait SuperConfig { 
    protected $mainDir = null; 

    public function setMainDir($dir) { 
     $this->mainDir = $dir; 
    } 
} 

:あなたはあまりにもコンストラクタでそれを行うことができます

class XYZ { 
    use SuperConfig; 

    public function doSomething() { 
     $this->setMainDir('path/to/your/dir/'); 
    } 
} 

注意(あなたが欲しいものをちょっとです)。

私はこれらの2つのソリューションは最高ですが、私はconfigクラスからすべてのクラスを拡張することを考えていません。ちょっとしたことはありません。あなたが望むだけ多くの特性を使うことができます(また、必要な数の静的なクラスを持つことができます)一方で、あなたは時間ごとに1つのクラスから拡張することができると想像してください。

+0

私は形質を使いたいと思っていますが、現在の解決策も嫌いですが、私が取り組んでいるプロジェクトは、PHP 5.3上で行われており、特性の使用は許可されていません。 5.3のよりよい解決法。 –

+0

とにかく私は静的なクラスに行くだろう。より多くのセンスと特質を生み出す。ちょうどあなたの問題のための可能な回避策を示したいと思った:) –

+0

ええ、それは良い方法を探している、私は本当にすべてのクラスでこれらのプロパティにアクセスするソリューションが好きではなかった。どうもありがとう。 :) –

関連する問題