PHPのmethod_existsとis_callableの挙動

# オブジェクト生成前

```php

class TestClass
{
    public function publicMethod()
    {
        echo "public<br>\n";
    }
    protected function protectedMethod()
    {
        echo "protected<br>\n";
    }
    private function privateMethod()
    {
        echo "private<br>\n";
    }
    public static function publicStaticMethod()
    {
        echo "public static<br>\n";
    }
    protected static function protectedStaticMethod()
    {
        echo "protected static<br>\n";
    }
    private static function privateStaticMethod()
    {
        echo "private static<br>\n";
    }
}


var_dump( method_exists('TestClass', '__construct') );                  // false
var_dump( method_exists('TestClass', '__get') );                        // false
var_dump( method_exists('TestClass', 'publicMethod') );                 // true
var_dump( method_exists('TestClass', 'protectedMethod') );              // true
var_dump( method_exists('TestClass', 'privateMethod') );                // true
var_dump( method_exists('TestClass', 'publicStaticMethod') );           // true
var_dump( method_exists('TestClass', 'protectedStaticMethod') );        // true
var_dump( method_exists('TestClass', 'privateStaticMethod') );          // true

var_dump( is_callable(array('TestClass', '__construct')) );             // false
var_dump( is_callable(array('TestClass', '__get')) );                   // false
var_dump( is_callable(array('TestClass', 'publicMethod')) );            // true
var_dump( is_callable(array('TestClass', 'protectedMethod')) );         // false
var_dump( is_callable(array('TestClass', 'privateMethod')) );           // false
var_dump( is_callable(array('TestClass', 'publicStaticMethod')) );      // true
var_dump( is_callable(array('TestClass', 'protectedStaticMethod')) );   // false
var_dump( is_callable(array('TestClass', 'privateStaticMethod')) );     // false
```

# オブジェクト生成後

```php
$TestClass = new TestClass();

var_dump( method_exists($TestClass, '__construct') );                   // false
var_dump( method_exists($TestClass, '__get') );                         // false
var_dump( method_exists($TestClass, 'publicMethod') );                  // true
var_dump( method_exists($TestClass, 'protectedMethod') );               // true
var_dump( method_exists($TestClass, 'privateMethod') );                 // true
var_dump( method_exists($TestClass, 'publicStaticMethod') );            // true
var_dump( method_exists($TestClass, 'protectedStaticMethod') );         // true
var_dump( method_exists($TestClass, 'privateStaticMethod') );           // true

var_dump( is_callable(array($TestClass, '__construct')) );              // false
var_dump( is_callable(array($TestClass, '__get')) );                    // false
var_dump( is_callable(array($TestClass, 'publicMethod')) );             // true
var_dump( is_callable(array($TestClass, 'protectedMethod')) );          // false
var_dump( is_callable(array($TestClass, 'privateMethod')) );            // false
var_dump( is_callable(array($TestClass, 'publicStaticMethod')) );       // true
var_dump( is_callable(array($TestClass, 'protectedStaticMethod')) );    // false
var_dump( is_callable(array($TestClass, 'privateStaticMethod')) );      // false
```

# クラスの継承

```php
class TestChildClass extends TestClass
{
    public function __construct()
    {
        echo "__construct<br>\n";
    }
    public function __get($get)
    {
        echo "__get<br>\n";
    }
    public function check()
    {
        echo "</pre>\n<h2>子オブジェクト \$this</h2>\n<pre>";

        var_dump( method_exists($this, '__construct') );                    // true
        var_dump( method_exists($this, '__get') );                          // true
        var_dump( method_exists($this, 'publicMethod') );                   // true
        var_dump( method_exists($this, 'protectedMethod') );                // true
        var_dump( method_exists($this, 'privateMethod') );                  // true
        var_dump( method_exists($this, 'publicStaticMethod') );             // true
        var_dump( method_exists($this, 'protectedStaticMethod') );          // true
        var_dump( method_exists($this, 'privateStaticMethod') );            // true

        var_dump( is_callable(array($this, '__construct')) );               // true
        var_dump( is_callable(array($this, '__get')) );                     // true
        var_dump( is_callable(array($this, 'publicMethod')) );              // true
        var_dump( is_callable(array($this, 'protectedMethod')) );           // true
        var_dump( is_callable(array($this, 'privateMethod')) );             // false
        var_dump( is_callable(array($this, 'publicStaticMethod')) );        // true
        var_dump( is_callable(array($this, 'protectedStaticMethod')) );     // true
        var_dump( is_callable(array($this, 'privateStaticMethod')) );       // false

        echo "</pre>\n<h2>子オブジェクト self</h2>\n<pre>";

        var_dump( method_exists('self', '__construct') );                   // false
        var_dump( method_exists('self', '__get') );                         // false
        var_dump( method_exists('self', 'publicMethod') );                  // false
        var_dump( method_exists('self', 'protectedMethod') );               // false
        var_dump( method_exists('self', 'privateMethod') );                 // false
        var_dump( method_exists('self', 'publicStaticMethod') );            // false
        var_dump( method_exists('self', 'protectedStaticMethod') );         // false
        var_dump( method_exists('self', 'privateStaticMethod') );           // false

        var_dump( is_callable(array('self', '__construct')) );              // true
        var_dump( is_callable(array('self', '__get')) );                    // true
        var_dump( is_callable(array('self', 'publicMethod')) );             // true
        var_dump( is_callable(array('self', 'protectedMethod')) );          // true
        var_dump( is_callable(array('self', 'privateMethod')) );            // false
        var_dump( is_callable(array('self', 'publicStaticMethod')) );       // true
        var_dump( is_callable(array('self', 'protectedStaticMethod')) );    // true
        var_dump( is_callable(array('self', 'privateStaticMethod')) );      // false

        echo "</pre>\n<h2>子オブジェクト parent</h2>\n<pre>";

        var_dump( method_exists('parent', '__construct') );                 // false
        var_dump( method_exists('parent', '__get') );                       // false
        var_dump( method_exists('parent', 'publicMethod') );                // false
        var_dump( method_exists('parent', 'protectedMethod') );             // false
        var_dump( method_exists('parent', 'privateMethod') );               // false
        var_dump( method_exists('parent', 'publicStaticMethod') );          // false
        var_dump( method_exists('parent', 'protectedStaticMethod') );       // false
        var_dump( method_exists('parent', 'privateStaticMethod') );         // false

        var_dump( is_callable(array('parent', '__construct')) );            // false
        var_dump( is_callable(array('parent', '__get')) );                  // false
        var_dump( is_callable(array('parent', 'publicMethod')) );           // true
        var_dump( is_callable(array('parent', 'protectedMethod')) );        // true
        var_dump( is_callable(array('parent', 'privateMethod')) );          // false
        var_dump( is_callable(array('parent', 'publicStaticMethod')) );     // true
        var_dump( is_callable(array('parent', 'protectedStaticMethod')) );  // true
        var_dump( is_callable(array('parent', 'privateStaticMethod')) );    // false

        echo "</pre>\n<h2>子オブジェクト static</h2>\n<pre>";

        var_dump( method_exists('static', '__construct') );                 // false
        var_dump( method_exists('static', '__get') );                       // false
        var_dump( method_exists('static', 'publicMethod') );                // false
        var_dump( method_exists('static', 'protectedMethod') );             // false
        var_dump( method_exists('static', 'privateMethod') );               // false
        var_dump( method_exists('static', 'publicStaticMethod') );          // false
        var_dump( method_exists('static', 'protectedStaticMethod') );       // false
        var_dump( method_exists('static', 'privateStaticMethod') );         // false

        var_dump( is_callable(array('static', '__construct')) );            // true
        var_dump( is_callable(array('static', '__get')) );                  // true
        var_dump( is_callable(array('static', 'publicMethod')) );           // true
        var_dump( is_callable(array('static', 'protectedMethod')) );        // true
        var_dump( is_callable(array('static', 'privateMethod')) );          // false
        var_dump( is_callable(array('static', 'publicStaticMethod')) );     // true
        var_dump( is_callable(array('static', 'protectedStaticMethod')) );  // true
        var_dump( is_callable(array('static', 'privateStaticMethod')) );    // false
    }
}

echo "</pre>\n<h2>子オブジェクト生成前</h2>\n<pre>";

var_dump( method_exists('TestChildClass', '__construct') );                 // true
var_dump( method_exists('TestChildClass', '__get') );                       // true
var_dump( method_exists('TestChildClass', 'publicMethod') );                // true
var_dump( method_exists('TestChildClass', 'protectedMethod') );             // true
var_dump( method_exists('TestChildClass', 'privateMethod') );               // true
var_dump( method_exists('TestChildClass', 'publicStaticMethod') );          // true
var_dump( method_exists('TestChildClass', 'protectedStaticMethod') );       // true
var_dump( method_exists('TestChildClass', 'privateStaticMethod') );         // true

var_dump( is_callable(array('TestChildClass', '__construct')) );            // false
var_dump( is_callable(array('TestChildClass', '__get')) );                  // false
var_dump( is_callable(array('TestChildClass', 'publicMethod')) );           // true
var_dump( is_callable(array('TestChildClass', 'protectedMethod')) );        // false
var_dump( is_callable(array('TestChildClass', 'privateMethod')) );          // false
var_dump( is_callable(array('TestChildClass', 'publicStaticMethod')) );     // true
var_dump( is_callable(array('TestChildClass', 'protectedStaticMethod')) );  // false
var_dump( is_callable(array('TestChildClass', 'privateStaticMethod')) );    // false

echo "</pre>\n<h2>子オブジェクト生成後</h2>\n<pre>";

$TestChildClass = new TestChildClass();

var_dump( method_exists($TestChildClass, '__construct') );                  // true
var_dump( method_exists($TestChildClass, '__get') );                        // true
var_dump( method_exists($TestChildClass, 'publicMethod') );                 // true
var_dump( method_exists($TestChildClass, 'protectedMethod') );              // true
var_dump( method_exists($TestChildClass, 'privateMethod') );                // true
var_dump( method_exists($TestChildClass, 'publicStaticMethod') );           // true
var_dump( method_exists($TestChildClass, 'protectedStaticMethod') );        // true
var_dump( method_exists($TestChildClass, 'privateStaticMethod') );          // true

var_dump( is_callable(array($TestChildClass, '__construct')) );             // true
var_dump( is_callable(array($TestChildClass, '__get')) );                   // true
var_dump( is_callable(array($TestChildClass, 'publicMethod')) );            // true
var_dump( is_callable(array($TestChildClass, 'protectedMethod')) );         // false
var_dump( is_callable(array($TestChildClass, 'privateMethod')) );           // false
var_dump( is_callable(array($TestChildClass, 'publicStaticMethod')) );      // true
var_dump( is_callable(array($TestChildClass, 'protectedStaticMethod')) );   // false
var_dump( is_callable(array($TestChildClass, 'privateStaticMethod')) );     // false

$TestChildClass->check();
```

# トレイトを使用した場合

```php
trait FunctionTrait
{
    public function __construct()
    {
        echo "trait __construct<br>\n";
    }
    public function __get($get)
    {
        echo "trait __get<br>\n";
    }
    public function traitPublicMethod()
    {
        echo "trait public<br>\n";
    }
    protected function traitProtectedMethod()
    {
        echo "trait protected<br>\n";
    }
    private function traitPrivateMethod()
    {
        echo "trait private<br>\n";
    }
    public static function traitPublicStaticMethod()
    {
        echo "trait public static<br>\n";
    }
    protected static function traitProtectedStaticMethod()
    {
        echo "trait protected static<br>\n";
    }
    private static function traitPrivateStaticMethod()
    {
        echo "trait private static<br>\n";
    }

}

trait CheckTrait
{
    public function check()
    {
        echo "</pre>\n<h2>トレイト \$this</h2>\n<pre>";

        var_dump( method_exists($this, '__construct') );                    // true
        var_dump( method_exists($this, '__get') );                          // true
        var_dump( method_exists($this, 'publicMethod') );                   // true
        var_dump( method_exists($this, 'protectedMethod') );                // true
        var_dump( method_exists($this, 'privateMethod') );                  // true
        var_dump( method_exists($this, 'publicStaticMethod') );             // true
        var_dump( method_exists($this, 'protectedStaticMethod') );          // true
        var_dump( method_exists($this, 'privateStaticMethod') );            // true
        var_dump( method_exists($this, 'traitPublicMethod') );              // true
        var_dump( method_exists($this, 'traitProtectedMethod') );           // true
        var_dump( method_exists($this, 'traitPrivateMethod') );             // true
        var_dump( method_exists($this, 'traitPublicStaticMethod') );        // true
        var_dump( method_exists($this, 'traitProtectedStaticMethod') );     // true
        var_dump( method_exists($this, 'traitPrivateStaticMethod') );       // true

        var_dump( is_callable(array($this, '__construct')) );               // true
        var_dump( is_callable(array($this, '__get')) );                     // true
        var_dump( is_callable(array($this, 'publicMethod')) );              // true
        var_dump( is_callable(array($this, 'protectedMethod')) );           // true
        var_dump( is_callable(array($this, 'privateMethod')) );             // false
        var_dump( is_callable(array($this, 'publicStaticMethod')) );        // true
        var_dump( is_callable(array($this, 'protectedStaticMethod')) );     // true
        var_dump( is_callable(array($this, 'privateStaticMethod')) );       // false
        var_dump( is_callable(array($this, 'traitPublicMethod')) );         // true
        var_dump( is_callable(array($this, 'traitProtectedMethod')) );      // true
        var_dump( is_callable(array($this, 'traitPrivateMethod')) );        // true
        var_dump( is_callable(array($this, 'traitPublicStaticMethod')) );   // true
        var_dump( is_callable(array($this, 'traitProtectedStaticMethod')) );// true
        var_dump( is_callable(array($this, 'traitPrivateStaticMethod')) );  // true

        echo "</pre>\n<h2>トレイト self</h2>\n<pre>";

        var_dump( method_exists('self', '__construct') );                   // false
        var_dump( method_exists('self', '__get') );                         // false
        var_dump( method_exists('self', 'publicMethod') );                  // false
        var_dump( method_exists('self', 'protectedMethod') );               // false
        var_dump( method_exists('self', 'privateMethod') );                 // false
        var_dump( method_exists('self', 'publicStaticMethod') );            // false
        var_dump( method_exists('self', 'protectedStaticMethod') );         // false
        var_dump( method_exists('self', 'privateStaticMethod') );           // false
        var_dump( method_exists('self', 'traitPublicMethod') );             // false
        var_dump( method_exists('self', 'traitProtectedMethod') );          // false
        var_dump( method_exists('self', 'traitPrivateMethod') );            // false
        var_dump( method_exists('self', 'traitPublicStaticMethod') );       // false
        var_dump( method_exists('self', 'traitProtectedStaticMethod') );    // false
        var_dump( method_exists('self', 'traitPrivateStaticMethod') );      // false

        var_dump( is_callable(array('self', '__construct')) );                  // true
        var_dump( is_callable(array('self', '__get')) );                        // true
        var_dump( is_callable(array('self', 'publicMethod')) );                 // true
        var_dump( is_callable(array('self', 'protectedMethod')) );              // true
        var_dump( is_callable(array('self', 'privateMethod')) );                // false
        var_dump( is_callable(array('self', 'publicStaticMethod')) );           // true
        var_dump( is_callable(array('self', 'protectedStaticMethod')) );        // true
        var_dump( is_callable(array('self', 'privateStaticMethod')) );          // false
        var_dump( is_callable(array('self', 'traitPublicMethod')) );            // true
        var_dump( is_callable(array('self', 'traitProtectedMethod')) );         // true
        var_dump( is_callable(array('self', 'traitPrivateMethod')) );           // true
        var_dump( is_callable(array('self', 'traitPublicStaticMethod')) );      // true
        var_dump( is_callable(array('self', 'traitProtectedStaticMethod')) );   // true
        var_dump( is_callable(array('self', 'traitPrivateStaticMethod')) );     // true

        echo "</pre>\n<h2>トレイト parent</h2>\n<pre>";

        var_dump( method_exists('parent', '__construct') );                     // false
        var_dump( method_exists('parent', '__get') );                           // false
        var_dump( method_exists('parent', 'publicMethod') );                    // false
        var_dump( method_exists('parent', 'protectedMethod') );                 // false
        var_dump( method_exists('parent', 'privateMethod') );                   // false
        var_dump( method_exists('parent', 'publicStaticMethod') );              // false
        var_dump( method_exists('parent', 'protectedStaticMethod') );           // false
        var_dump( method_exists('parent', 'privateStaticMethod') );             // false
        var_dump( method_exists('parent', 'traitPublicMethod') );               // false
        var_dump( method_exists('parent', 'traitProtectedMethod') );            // false
        var_dump( method_exists('parent', 'traitPrivateMethod') );              // false
        var_dump( method_exists('parent', 'traitPublicStaticMethod') );         // false
        var_dump( method_exists('parent', 'traitProtectedStaticMethod') );      // false
        var_dump( method_exists('parent', 'traitPrivateStaticMethod') );        // false

        var_dump( is_callable(array('parent', '__construct')) );                // false
        var_dump( is_callable(array('parent', '__get')) );                      // false
        var_dump( is_callable(array('parent', 'publicMethod')) );               // true
        var_dump( is_callable(array('parent', 'protectedMethod')) );            // true
        var_dump( is_callable(array('parent', 'privateMethod')) );              // false
        var_dump( is_callable(array('parent', 'publicStaticMethod')) );         // true
        var_dump( is_callable(array('parent', 'protectedStaticMethod')) );      // true
        var_dump( is_callable(array('parent', 'privateStaticMethod')) );        // false
        var_dump( is_callable(array('parent', 'traitPublicMethod')) );          // false
        var_dump( is_callable(array('parent', 'traitProtectedMethod')) );       // false
        var_dump( is_callable(array('parent', 'traitPrivateMethod')) );         // false
        var_dump( is_callable(array('parent', 'traitPublicStaticMethod')) );    // false
        var_dump( is_callable(array('parent', 'traitProtectedStaticMethod')) ); // false
        var_dump( is_callable(array('parent', 'traitPrivateStaticMethod')) );   // false

        echo "</pre>\n<h2>トレイト static</h2>\n<pre>";

        var_dump( method_exists('static', '__construct') );                     // false
        var_dump( method_exists('static', '__get') );                           // false
        var_dump( method_exists('static', 'publicMethod') );                    // false
        var_dump( method_exists('static', 'protectedMethod') );                 // false
        var_dump( method_exists('static', 'privateMethod') );                   // false
        var_dump( method_exists('static', 'publicStaticMethod') );              // false
        var_dump( method_exists('static', 'protectedStaticMethod') );           // false
        var_dump( method_exists('static', 'privateStaticMethod') );             // false
        var_dump( method_exists('static', 'traitPublicMethod') );               // false
        var_dump( method_exists('static', 'traitProtectedMethod') );            // false
        var_dump( method_exists('static', 'traitPrivateMethod') );              // false
        var_dump( method_exists('static', 'traitPublicStaticMethod') );         // false
        var_dump( method_exists('static', 'traitProtectedStaticMethod') );      // false
        var_dump( method_exists('static', 'traitPrivateStaticMethod') );        // false

        var_dump( is_callable(array('static', '__construct')) );                // true
        var_dump( is_callable(array('static', '__get')) );                      // true
        var_dump( is_callable(array('static', 'publicMethod')) );               // true
        var_dump( is_callable(array('static', 'protectedMethod')) );            // true
        var_dump( is_callable(array('static', 'privateMethod')) );              // false
        var_dump( is_callable(array('static', 'publicStaticMethod')) );         // true
        var_dump( is_callable(array('static', 'protectedStaticMethod')) );      // true
        var_dump( is_callable(array('static', 'privateStaticMethod')) );        // false
        var_dump( is_callable(array('static', 'traitPublicMethod')) );          // true
        var_dump( is_callable(array('static', 'traitProtectedMethod')) );       // true
        var_dump( is_callable(array('static', 'traitPrivateMethod')) );         // true
        var_dump( is_callable(array('static', 'traitPublicStaticMethod')) );    // true
        var_dump( is_callable(array('static', 'traitProtectedStaticMethod')) ); // true
        var_dump( is_callable(array('static', 'traitPrivateStaticMethod')) );   // true
    }
}

class TestChildWithTraitClass extends TestClass
{
    use FunctionTrait;
    use CheckTrait;
}

echo "</pre>\n<h2>トレイト付き子オブジェクト生成前</h2>\n<pre>";

var_dump( method_exists('TestChildWithTraitClass', '__construct') );                    // true
var_dump( method_exists('TestChildWithTraitClass', '__get') );                          // true
var_dump( method_exists('TestChildWithTraitClass', 'publicMethod') );                   // true
var_dump( method_exists('TestChildWithTraitClass', 'protectedMethod') );                // true
var_dump( method_exists('TestChildWithTraitClass', 'privateMethod') );                  // true
var_dump( method_exists('TestChildWithTraitClass', 'publicStaticMethod') );             // true
var_dump( method_exists('TestChildWithTraitClass', 'protectedStaticMethod') );          // true
var_dump( method_exists('TestChildWithTraitClass', 'privateStaticMethod') );            // true
var_dump( method_exists('TestChildWithTraitClass', 'traitPublicMethod') );              // true
var_dump( method_exists('TestChildWithTraitClass', 'traitProtectedMethod') );           // true
var_dump( method_exists('TestChildWithTraitClass', 'traitPrivateMethod') );             // true
var_dump( method_exists('TestChildWithTraitClass', 'traitPublicStaticMethod') );        // true
var_dump( method_exists('TestChildWithTraitClass', 'traitProtectedStaticMethod') );     // true
var_dump( method_exists('TestChildWithTraitClass', 'traitPrivateStaticMethod') );       // true

var_dump( is_callable(array('TestChildWithTraitClass', '__construct')) );               // false
var_dump( is_callable(array('TestChildWithTraitClass', '__get')) );                     // false
var_dump( is_callable(array('TestChildWithTraitClass', 'publicMethod')) );              // true
var_dump( is_callable(array('TestChildWithTraitClass', 'protectedMethod')) );           // false
var_dump( is_callable(array('TestChildWithTraitClass', 'privateMethod')) );             // false
var_dump( is_callable(array('TestChildWithTraitClass', 'publicStaticMethod')) );        // true
var_dump( is_callable(array('TestChildWithTraitClass', 'protectedStaticMethod')) );     // false
var_dump( is_callable(array('TestChildWithTraitClass', 'privateStaticMethod')) );       // false
var_dump( is_callable(array('TestChildWithTraitClass', 'traitPublicMethod')) );         // true
var_dump( is_callable(array('TestChildWithTraitClass', 'traitProtectedMethod')) );      // false
var_dump( is_callable(array('TestChildWithTraitClass', 'traitPrivateMethod')) );        // false
var_dump( is_callable(array('TestChildWithTraitClass', 'traitPublicStaticMethod')) );   // true
var_dump( is_callable(array('TestChildWithTraitClass', 'traitProtectedStaticMethod')) );// false
var_dump( is_callable(array('TestChildWithTraitClass', 'traitPrivateStaticMethod')) );  // false

echo "</pre>\n<h2>トレイト付き子オブジェクト生成後</h2>\n<pre>";

$TestChildWithTraitClass = new TestChildWithTraitClass();

var_dump( method_exists($TestChildWithTraitClass, '__construct') );                     // true
var_dump( method_exists($TestChildWithTraitClass, '__get') );                           // true
var_dump( method_exists($TestChildWithTraitClass, 'publicMethod') );                    // true
var_dump( method_exists($TestChildWithTraitClass, 'protectedMethod') );                 // true
var_dump( method_exists($TestChildWithTraitClass, 'privateMethod') );                   // true
var_dump( method_exists($TestChildWithTraitClass, 'publicStaticMethod') );              // true
var_dump( method_exists($TestChildWithTraitClass, 'protectedStaticMethod') );           // true
var_dump( method_exists($TestChildWithTraitClass, 'privateStaticMethod') );             // true
var_dump( method_exists($TestChildWithTraitClass, 'traitPublicMethod') );               // true
var_dump( method_exists($TestChildWithTraitClass, 'traitProtectedMethod') );            // true
var_dump( method_exists($TestChildWithTraitClass, 'traitPrivateMethod') );              // true
var_dump( method_exists($TestChildWithTraitClass, 'traitPublicStaticMethod') );         // true
var_dump( method_exists($TestChildWithTraitClass, 'traitProtectedStaticMethod') );      // true
var_dump( method_exists($TestChildWithTraitClass, 'traitPrivateStaticMethod') );        // true

var_dump( is_callable(array($TestChildWithTraitClass, '__construct')) );                // true
var_dump( is_callable(array($TestChildWithTraitClass, '__get')) );                      // true
var_dump( is_callable(array($TestChildWithTraitClass, 'publicMethod')) );               // true
var_dump( is_callable(array($TestChildWithTraitClass, 'protectedMethod')) );            // false
var_dump( is_callable(array($TestChildWithTraitClass, 'privateMethod')) );              // false
var_dump( is_callable(array($TestChildWithTraitClass, 'publicStaticMethod')) );         // true
var_dump( is_callable(array($TestChildWithTraitClass, 'protectedStaticMethod')) );      // false
var_dump( is_callable(array($TestChildWithTraitClass, 'privateStaticMethod')) );        // false
var_dump( is_callable(array($TestChildWithTraitClass, 'traitPublicMethod')) );          // true
var_dump( is_callable(array($TestChildWithTraitClass, 'traitProtectedMethod')) );       // false
var_dump( is_callable(array($TestChildWithTraitClass, 'traitPrivateMethod')) );         // false
var_dump( is_callable(array($TestChildWithTraitClass, 'traitPublicStaticMethod')) );    // true
var_dump( is_callable(array($TestChildWithTraitClass, 'traitProtectedStaticMethod')) ); // false
var_dump( is_callable(array($TestChildWithTraitClass, 'traitPrivateStaticMethod')) );   // false

$TestChildWithTraitClass->check();
```