PHP получить видимость - PullRequest
       18

PHP получить видимость

4 голосов
/ 17 января 2011

Можно ли получить видимость методов и свойств внутри класса в php?

Я хочу иметь возможность сделать что-то вроде этого:

function __call($method, $args)
{
    if(is_callable(array($this,$method))
    {
        if(get_visibility(array($this,$method)) == 'private')
            //dosomething
        elseif(get_visibility(array($this,$method)) == 'protected')
            //dosomething
        else
            //dosomething
    } 
} 

Ответы [ 3 ]

7 голосов
/ 17 января 2011

is_callable учитывает видимость, но поскольку вы используете его из класса, он всегда будет иметь значение TRUE.

Чтобы получить видимость метода, вы должны использовать Reflection API и проверить модификаторы метода

Сокращенный пример из руководства по PHP:

class Testing
{
    final public static function foo()
    {
        return;
    }
}

// this would go into your __call method
$foo = new ReflectionMethod('Testing', 'foo');
echo implode(
    Reflection::getModifierNames(
        $foo->getModifiers()
    )
); // outputs finalpublicstatic

То же самое доступно для свойств .

Однако из-за сложности отражения в классе это может быть медленным.Вы должны сравнить его, чтобы увидеть, сильно ли оно влияет на ваше приложение.

6 голосов
/ 17 января 2011

Возможно, вы захотите использовать для этого PHP Reflection API .Тем не менее, я также должен спросить вас , почему вы хотите это сделать, потому что Reflection обычно используется только в ситуациях, которые с самого начала немного хакерские.Это возможно, хотя, вот так:

<?php

class Foo {
    /**
     *
     * @var ReflectionClass
     */
    protected $reflection;
    protected function bar( ) {

    }

    private function baz( ) {

    }

    public function __call( $method, $args ) {
        if( ( $reflMethod = $this->method( $method ) ) !== false ) {
            if( $reflMethod->isPrivate( ) ) {
                echo "That's private.<br />\n";
            }
            elseif( $reflMethod->isProtected( ) ) {
                echo "That's protected.<br />\n";
            }
        }
    }

    protected function method( $name ) {
        if( !isset( $this->methods[$name] ) ) {
            if( $this->reflect( )->hasMethod( $name ) ) {
                $this->methods[$name] = $this->reflect( )->getMethod( $name );
            }
            else {
                $this->methods[$name] = false;
            }
        }
        return $this->methods[$name];
    }

    protected function reflect( ) {
        if( !isset( $this->reflection ) ) {
            $this->reflection = new ReflectionClass( $this );
        }
        return $this->reflection;
    }
}

$foo = new Foo( );
$foo->baz( );
$foo->bar( );
0 голосов
/ 06 апреля 2016

Этот ответ немного запоздал, но я чувствую, что есть еще некоторая добавленная ценность, упоминая get_class_methods() в сочетании с method_exists():

<?php
class Foo {
    // ...
    public function getVisibility($method) {
        if ( method_exists($this, $method) && in_array($method, get_class_methods($this)) ) {
            return 'protected or public';
        } else {
            return 'private';
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...