私は別のクラスを作成し、PHPでクラスを持っている、と私はこの子クラスは親クラスを呼び出すことができるようにしたいが、子クラスへの引数として$これを介さず。私は親クラスをグローバルにしたくない。親クラスを呼び出す方法はありますか、どういうわけかparent-> functionまたはそれに類するものでしょうか?PHP:あなたを作成したクラスを呼び出すことは可能ですか?
答えて
それは一種のハッキングが、私はあなたが(「親」の階層クラスに無関係のインスタンスを保持している親子関係がちょうど組成物であると呼んでいるものだと思うdebug_backtrace()
を分析しようとすると、「です子')。私の前提が正しければ、2つのクラスが緊密に結合され、どこかに悪いデザイン(「親」、「子供」、またはその両方)を指しているので、これは悪いことです。
あまり臭い選択肢:
- 「子」から必要なデータを取得し、そのデータ
- と「親」でメソッドを呼び出して「親」は「子」に保持するデータを渡します「子」がそれを呼び出すことができるようにメソッドを配置します。
- 「親」のメソッドを呼び出し、その結果を「子」に渡します。
- 継承を使用すると、「親」と'子ども'は本当に親と子になり、どちらもこの方法を持っていれば、 '親'は「子」を作成すると、コード内の子を直接使用します。マチェイが言うよう
、これはかなりハックであり、私はそれをお勧めしませんが、それは可能です:
<?php
class B
{
function B() {
$trace = debug_backtrace();
$trace[1]['object']->y();
}
}
class A
{
function x() {
$z = new B;
}
function y() {
printf("hi");
}
}
$test = new A;
$test->x();
?>
+1悪い方法を示す誘惑に抵抗しないために+1: –
+1。おそらくOPの貧弱な後継者を痛みの世界に導入し、OPがsetParent()を実装するにはあまりにも怠惰であるため、熟練したコーダーの間にいくつかの敵を作ったでしょう。 – stefs
@Schnalle、ねえ!上にはかなりの免責事項があります! :) –
(...)しかし、引数として$これを通過せず子クラスに
天、WHY? "見て、私は私の手で持っていないでおしっこをすることができます。
、それはとても簡単かもしれないが、私は、これは禁止されている理由は、我々が知っていることは決してないだろうと仮定します。私の推測では、OOPを理解できないだけです(クラス階層とインスタンス階層の間の混乱が示唆するように)、あなたはそれを学ぶのが面倒です。 Ceci n'est pas une pipe!
見て:はい、それは簡単
<?php
class AClass {
public $parent = false;
public function setParent($parent) {
$this->parent = $parent;
}
public function createChild() {
$newInstance = new AClass();
$newInstance->setParent($this);
}
}
?>
です!あなたは今親を持っています。
かは、親クラスを変更することが許可されていないので、それは、ありますか?
は秘密があるのですが、私はあなたに教えてあげる:悪ウォーロックのため
0番目のレベルのキャントリップ:inheritance、また「class B extends A {}
」として知られているが。
私が意味する、sarcasic、役に立たないお尻であることのため、事前に謝罪、しかし、私が本当に謝罪の後ろに立っていたと思いますが、私はその答えを書かれていません。
BUT私は、あなたが私たちに参照渡しが禁止されている正当な理由を与えることができれば、あなたの質問に投票することを約束します(正直にお詫び申し上げます)。
私はこれが可能かどうかを知るには十分ではありませんが、オブジェクトのコンストラクタにデリゲート/コールバックを渡すことはできませんか?この方法では、オブジェクト全体が呼び出されるメソッドへの参照だけがありません!
HTH
ワンショット
- 1. ES6継承クラスでスーパーセッターを呼び出すことは可能ですか?
- 2. C#PHPのような呼び出し可能ファイルを作成する
- 3. Application androidを拡張したクラスを呼び出すことは可能ですか?
- 4. コンストラクタを呼び出すことは可能ですか?
- 5. インスタンスのクローン作成とメソッド呼び出しの連鎖は可能ですか?
- 6. 外部ムービークリップの機能を呼び出したり、データを渡すことは可能ですか
- 7. 安全な画像のためにflickr API呼び出しをフィルタリングすることは可能ですか?
- 8. 単体テストで呼び出し可能なメソッドを作成する
- 9. 派生クラス関数をBaseクラスから呼び出すことは可能ですか
- 10. CloudFrontがREST API呼び出しをキャッシュすることは可能ですか
- 11. Flexで軽量REST呼び出しを行うことは可能ですか?
- 12. なぜタイプパラメータで静的メソッドを呼び出すことが可能ですか?
- 13. 呼び出し可能なクラスでエラーが発生しました:doPingは抽象メソッドではなく、抽象メソッド呼び出し()をオーバーライドしませんか?
- 14. window.locationが新しいURLをロードした後に関数を呼び出すことは可能ですか?
- 15. VBAでjavaから関数を呼び出すことは可能ですか?
- 16. Mac App Storeに提出されたアプリ内でopensslを呼び出すことは可能ですか?
- 17. バッチPOST API呼び出しを行うことは可能ですか?
- 18. クレードルの呼び出しを同期させることは可能ですか?
- 19. 基本クラスやインタフェースを持たない動的なプロキシを作成することは可能ですか?
- 20. パッケージを呼び出さずにJavaで作成した変数をどのように呼び出すことができますか? (その同じクラスで)
- 21. 単純なクラスのフォームを作成することは可能ですか
- 22. 呼び出し可能イテレータの操作
- 23. .NETで作成したWindowsサービスを呼び出す方法は?
- 24. .NETからOCamlを呼び出すことは可能ですか?
- 25. ring/compojureからjavaサーブレットを呼び出すことは可能ですか?
- 26. @ Html.ActionLinkからHttpPostアクションメソッドを呼び出すことは可能ですか?
- 27. ObjCからPythonモジュールを呼び出すことは可能ですか?
- 28. javascriptからobjective-c pushViewControllerを呼び出すことは可能ですか?
- 29. Excel 2007から.NETコードを呼び出すことは可能ですか?
- 30. Springのスクリプトレットからコントローラメソッドを呼び出すことは可能ですか?
あなたは親が第二クラスのコンストラクタに$これをで通過することなく何であるかを知ることはできません。 PHPはそれをしません。 –
"class"、 "parent"、 "child"の使い方はかなり誤解を招く(または単に間違っています;-))。あなたは主にクラス(オブジェクト)のインスタンスについて話しています。クラスベースのoopでは、「クラスFoo extends Bar」のような「親クラス」だけの「親オブジェクト」はありません(私は誰かが私を証明するのを待っています間違って...) – VolkerK
ママ!ムーアム! Muuuuuuuuuuuum!彼女は聞いていません.... – cjk