0

次の PHP コードが正しくないことはわかっていますが、このアイデアを実現する方法を知りたいです。

function A(){
    $a = 'Hello';
    $b = 'World';
    $c = $a.' '.$b;
    echo 'blah blah blah times 1,000';

    function B($c){
        return $c;
    }
}
echo function B();
4

3 に答える 3

3

いくつかのアプローチがあります。最も簡単な方法は次のとおりです。

function B($c){
    return $c;
}

function A(){
    $a = 'Hello';
    $b = 'World';
    $c = $a.' '.$b;
    echo 'blah blah blah times 1,000';
    B($c);
}

}
echo B();

しかし、それBが何もしないことを考えると、あなたはただ行くことができます:

function A(){
    $a = 'Hello';
    $b = 'World';
    $c = $a.' '.$b;
    echo 'blah blah blah times 1,000';
    return $c;
}

echo A();

より大きな出力を得るために、関数間で値を交換したいと思っているのではないかと思います。そのためには、PHPが可能な限り追いついているオブジェクト指向プログラミングを調査する必要があります。

OOPアプローチ:

Class ChatterBox {

   public function sayHello() {
        $a = 'Hello';
        $b = 'World';
        $c = $a.' '.$b;        
        return $c 
    }

    public function rambleOn() {

       echo 'blah blah blah times 1,000';

     }

}

$small_talk = new ChatterBox();

echo $small_talk -> sayHello(); // Hello World!

$small_talk -> rambleOn() // 'blah blah blah times 1,000';

複数の関数(メソッド)を持つ1つの変数があるだけでなく、クラスに対してグローバルな1つのメソッドに値を設定すると、他のメソッドからアクセスできるという利点があります。したがって、常に自分の名前を含めたい場合は、次のようにできます。もう少し進んでください:

Class ChatterBox {

  function __construct($name) {
        $this -> name = (!empty($name)) ? $name : 'Mysterion';
  }

   public function set_intro() {

        $this -> intro = "My name is " . $this ->name . ".";

    }

   public function sayHello() {
        $a = 'Hello';
        $b = 'World';
        $c = $a.' '.$b;
        return $c . $this -> set_intro();
    }

    public function rambleOn() {

       echo $this -> intro . 'blah blah blah times 1,000';

     }

}

$small_talk = new ChatterBox("Rick");

echo $small_talk -> sayHello(); // Hello World! My name is Rick.

$small_talk -> rambleOn() // 'My name is Rick. blah blah blah times 1,000';

もちろん、OOPははるかに洗練されています(そして、前に言ったように、PHPはまだ追いついてきています)が、最初に、すべての関数を結び付けて変数を共有できるようにするのは良いことだと思います。おそらくラムダ関数物事の動きですが、私はまだOOPのコツをつかんでいるので、どちらが「最良」であるかを選択するよりも、両方に手を出すのが最善だと思います。特にあなたの例では、ラムダ(無名)関数は、一方の関数がもう一方の関数の中にある理由を(私には)実際には意味がありません。OOPでは、オブジェクト内のデータを追跡したり、関数間で値をやり取りしたりする必要がなくても、コンテキストに基づいて呼び出すオプションや選択肢などが異なる場合があるという点で理にかなっています。オブジェクト全体で使用される場合。

于 2012-05-26T23:35:27.610 に答える
2

PHP 5.3 以降を使用している場合は、無名関数を使用すると簡単です。

function A() {
    global $B;

    $a = 'Hello';
    $b = 'World';
    $c = $a.' '.$b;
    echo 'blah blah blah times 1,000';

    $B = function() use ($c) {
        return $c;
    };
}

A(); // blah blah blah times 1,000
echo $B(); // Hello World

そうでない場合は、 を使用して同じことを達成できますcreate_function

于 2012-05-26T23:29:45.037 に答える
0

スクリプトの動作方法では、Bはデフォルトでは未定義です。関数Aを呼び出すと、スクリプトの残りの部分にBが定義されます。例えば:

echo B('blah'); // Returns a 'function doesn't exist' error

A();
echo B('blah'); //Echos 'blah', as B is now defined.
于 2012-05-26T23:32:59.747 に答える