web-dev-qa-db-ja.com

__METHOD__および__FUNCTION__

私はこれら2つの違いを知っており、マニュアルを確認しました。

混乱しているよ。私は使えます __FUNCTION__クラスのメソッドでは、これはこのメソッドの名前を表します。エコーすると、名前が出力されます。ここは明確です。

しかし、なぜ__METHOD__非calssメソッドで。これは、通常の機能の名前も表します。通常の機能はいくつかのコンテナにありますか?とエコー__METHOD__通常の関数では、コンテナは何もありませんか?

コード:

<?php
class dog {
    private $name = 'dog';

    public static function name() {
        echo __METHOD__;
        echo"\n";
        echo __FUNCTION__;
        echo"\n";
    }

}
function test() {
    echo __FUNCTION__;
    echo"\n";
    echo __METHOD__;
}

dog::name();
test();

出力:

ei@localhost:~$ php test.php
dog::name
name
test
test

どんな助けでも感謝します。ありがとう。

12
Kris Roofe

「メソッド」は基本的に、クラス(またはクラス関数)内の関数の単なる名前です。したがって、__METHOD__はクラス名と(dog::name)と呼ばれる関数名で構成されますが、__FUNCTION__は関数の名前を提供するだけで、関数が含まれている可能性のあるクラスへの参照はありません。

__METHOD__がクラスの外で呼び出された場合、接頭辞として使用されるクラス部分がないため、__FUNCTION__と同じです。 __METHOD__は魔法の定数であり、常に使用できるため、クラスの外でも使用できます(最悪の場合、空の文字列が返されます)。

http://php.net/manual/en/language.constants.predefined.php

14
saitho

すべてのプログラミング言語で。メソッドは常にオブジェクトに対応します。メソッド<==>オブジェクト、関数は常にクラスとオブジェクト(静的関数)の両方に対応します。

そして最後に、静的メソッドの存在はありません

この場合..

[〜#〜]メソッド[〜#〜] =>クラス名を含む[〜#〜]関数[〜#〜] =>関数名のみを参照

説明が必要な場合は私に連絡してください。

1

あなたの疑問を明確にしましょう。

まず、クラスとオブジェクトについて説明します(違いは何ですか。)

次に、関数とメソッドについて説明します(違いは何ですか。)

クラスについて話す::それはあなたの論理的な実装です。

オブジェクト::クラスのインスタンスです(インスタンス〜コピー〜クローン〜...)

--NEW--演算子--->を使用している場合は、クラスのオブジェクト(コピーのみ)を作成しています。

クラス=============>〜NEW〜=======> OBJECT(クラスの新しいコピー..)同様に

FUNCTION ==========>〜NEW〜=======>メソッド(クラスではなくオブジェクトに属する)

Classは作成中のプログラムで、objectは実行中のクラスのコピーです。

クラスはROM(永続)に常駐し、オブジェクトはRAM(一時メモリ領域)に常駐します。

&関数をstaticとして宣言する場合、それはオブジェクトではなくクラスにのみ属します&ClassName :: staticFunctionName()を使用して同じ(静的関数)を呼び出すことができます

これが、STATIC_METHODの代わりにSTATIC_FUNCTIONが存在しない理由です!!!

コード例::

<?php
class Dog extends CI_Controller
{
public function __construct()
{
    parent::__construct();
}
public function index($params='')
{
}
private $name = 'dog';
public static function name()
{
    echo 'Inside static function & inside class'.'<br>';
    echo __METHOD__.'<br>';
    echo __FUNCTION__.'<br>';
}
public function test2()
{
    echo 'Inside NON STATIC function & inside class'.'<br>';
    echo __FUNCTION__.'<br>';
    echo __METHOD__.'<br>';
}
}
function test()
{
   echo 'Inside NON STATIC function & OUTSIDE class'.'<br>';
   echo __FUNCTION__.'<br>';
   echo __METHOD__.'<br>';
}
Dog::name();
test();
$somevar = new Dog;
$somevar->test2();
?>

出力::

Inside static function & inside class
Dog::name               //Class::function
name

Inside NON STATIC function & OUTSIDE class
test
test

Inside NON STATIC function & inside class
test2
Dog::test2            //Object::method

IN [〜#〜] method [〜#〜] IN静的コンテキストそれが非静的である場合はクラス名を表示します(単純な関数)関数のみを表示します名前のみ..

1