web-dev-qa-db-ja.com

PHPで2つのコロンはどういう意味ですか?

このような状況になったとき、それが何をしているのかわかりません。

Foo::Bar

それは道のように見えます。

31
ben

これは(一般的に)クラス内の静的メソッドまたはプロパティにアクセスするためのものです。これは、スコープ解決演算子、またはPaamayim Nekudotayimと呼ばれます(これにより、驚くほど紛らわしいエラーメッセージが表示されます!)。 http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php を参照してください。

40
Chris

::演算子はスコープ解決演算子です 。これは、クラスの外部から、クラス定数または静的プロパティとメソッドにアクセスするために使用されます。

ClassName::CONSTANT_VALUE
ClassName::staticMethod()

または、クラスメソッド内で、selfおよびparentを使用して同じクラスまたは親クラスを参照します。

self::CONSTANT_VALUE
self::staticMethod()
parent::CONSTANT_VALUE
parent::staticMethod()
52
Gumbo

スコープ解決演算子(::)の二重コロンは、クラスのstaticconstant、およびオーバーライドされたプロパティまたはメソッドへのアクセスを許可するトークンです。

<?php
class A {

public static $B = '1'; # Static class variable.

const B = '2'; # Class constant.

public static function B() { # Static class function.
    return '3';
}

}

echo A::$B . A::B . A::B(); # Outputs: 123
?>
4
susheel sahoo

PHPによる2つのコロンの使用に関する回答を補足するには "スコープ解決演算子"

さらに、二重コロンが使用されます。

  1. 修飾されていない、修飾された、またはエイリアスされたクラス名を完全修飾形式に解決するには、

  2. 以前に宣言されていない任意のメソッド名を使用して、クラスの「__callStatic」メソッドを呼び出すこと。

「:: class」を追加してクラス名を完全修飾形式に解決するには

クラス名の後に配置された2つのコロンとそれに続く「class」キーワードは、そのクラスの完全修飾名を文字列として提供します。 つまり、「ClassName :: class」は「ClassName」の完全修飾名に解決されます。 See:( A) マニュアル:クラスとオブジェクト:基本 、(B) マニュアル:クラスとオブジェクト:クラス定数 、および(C) マニュアル:言語リファレンス:定数

構文はPHP 5.5で採用されました。See:( A) [〜#〜] rfc [〜#〜] および(B) PHP 5.5の新機能

「:: class」構文は、名前空間内で、クラスの完全修飾名をその名前の 非修飾または修飾形式 または エイリアス から取得するのに役立ちます。

「:: class」構文は、クラス名だけでなくインターフェイス名も解決するように機能しているようですが、上記のリンク先のソースでは文書化されていないようです。

上記でリンクされている「:: class」RFCで説明されているように、クラス内では、構文は「self :: class」でも機能します。

いくつかの例:

<?php

namespace MyNamespace;

use MyNamespace\YourInterface as HerInterface;    
use MyNamespace\YourClass as HerClass;
use MyNamespace\TheirClass as OurClass;

interface MyInterface { }

interface YourInterface { }

class MyClass { }

class YourClass { }

class TheirClass
{
    public function fullName()
    {
        echo self::class;
    }
}

$ourClassInstance = new OurClass;

echo MyClass::class, PHP_EOL;
// outputs: MyNamespace\MyClass

echo HerClass::class, PHP_EOL;
// outputs: MyNamespace\YourClass

echo MyInterface::class, PHP_EOL;
// outputs: MyNamespace\MyInterface

echo HerInterface::class, PHP_EOL;
// outputs: MyNamespace\YourInterface

echo $ourClassInstance->fullName(), PHP_EOL;
// outputs: MyNamespace\TheirClass

宣言されていないメソッド名で「__callStatic」を呼び出すには

2つのコロンを使用して、クラスが宣言していない静的メソッド名を「呼び出す」ことができます。例:「ClassName :: ArbitraryMethodName()」。これを行うと、クラスで宣言されている場合、クラスの「__callStatic」メソッドが呼び出されます。また、宣言されていないメソッドの名前と宣言されていないメソッドに渡された引数を__callStaticに渡します。次に、__ callStaticメソッドは、呼び出しの処理方法を「動的に」選択できます。 PHPはこれを "overloading"__ callStatic "magic method" と呼びます。

追加を参照してください StackOverflowディスカッション

例:

<?php

namespace OurCompany\Orders;

class Intake
{
    public static function __callStatic($name, $arguments)
    {
        $item = substr($name, 5); // trims "order" prefix

        $specialistClass = "\OurCompany\Specialists\\" . $item;

        if (class_exists($specialistClass)) {
            $specialist = new $specialistClass;
            return $specialist->handleOrder($arguments);
        }

        return "I'm sorry, we can't help you with " .
            lcfirst($item) . ".";
    }
}

namespace OurCompany\Specialists;

class Car
{
    public function handleOrder($arguments)
    {
        return "May I help you with a $arguments[0] car?";
    }
}

class Truck
{
    public function handleOrder($arguments)
    {
        return "May I help you with a $arguments[0] truck?";
    }
}

use OurCompany\Orders\Intake;

echo Intake::orderCar("red"), PHP_EOL;
// outputs: May I help you with a red car?

echo Intake::orderTruck("pickup"), PHP_EOL;
// outputs: May I help you with a pickup truck?

echo Intake::orderShoes("suede"), PHP_EOL;
// outputs: I'm sorry, we can't help you with shoes.
0
Slack Undertow

スコープ解決演算子の使用

クラス定数、クラスプロパティ(静的)、クラス関数(静的)はすべて同じ名前を共有し、二重コロンを使用してアクセスできます

class B{
    public static $par = "par";
}
class A extends B{
    const B = "constant";
    public static $sel = "self";

    public static $b = "static property";
    public static function b(){
        echo "static function";
    }
    public static function c(){
        return parent::$par;
    }
    public static function d(){
        return self::$sel;
    }
     public static function e(){
        return self::$par;
    }
}

echo A::B.PHP_EOL;
echo A::$b.PHP_EOL;
echo A::b().PHP_EOL;
echo A::c().PHP_EOL;
echo A::d().PHP_EOL;
0
stalin wesley