2013-11-24 4 views
1

Я написал небольшой тестовый сценарий для тестирования смешанного использования статических и нестатических методов. При вызове публичного метода как статического метода он генерирует строгие предупреждения. Это заставило меня думать, что, возможно, вызов статического метода как общедоступного метода приведет к аналогичному предупреждению, но это не так.Можно ли статические методы вызывать как общедоступный метод?

Можно ли вызвать статические методы как нестатический метод? Есть ли последствия для этого?

<?php 
class TestS { 
    static function _testS() { 
    echo("Hello Static<br>\n"); 
    // Strict warning: Non-static method TestS::_tS() should not be 
    // called statically in TestS::_tS() 
    self::_tS(); 
    } 
    public function _tS() { 
    echo("tS<br>\n"); 
    } 
    public function _testP() { 
    echo("Hello Public<br>\n"); 
    self::_tP(); 
    } 
    static function _tP() { 
    echo("tP<br>\n"); 
    } 
    public function _testSP() { 
    $this->_tP(); 
    } 
} 

$test = new TestS(); 
echo("///////////<br>\n"); 
$test->_testP(); 
echo("///////////<br>\n"); 
TestS::_testS(); 
echo("///////////<br>\n"); 
$test->_testSP(); 
echo("///////////<br>\n"); 
+0

Пожалуйста, не используйте статические методы. –

+0

Есть ли веские аргументы, чтобы не использовать статические методы, отличные от предпочтений? Мне нравится использовать статические методы/классы, чтобы очистить глобальную область от множества небольших функций полезности. – forsvunnet

+0

Проблема со статическими методами и переменными ** заключается в том, что они глобальны. –

ответ

1

Это нормально вызывать статические методы, как общедоступный метод?

Теоретически, это так. Это связано с тем, что статический метод не ссылается на $this в любом месте, поэтому он будет работать при вызове либо статически, либо как метод экземпляра.

Есть ли последствия для этого?

Хорошо, что явным образом указываю, какой метод вы вызываете; когда вы оглядываетесь на свой код, вы точно знаете, какой метод является статичным из-за того, как вы его вызываете, за исключением использования parent::method() внутри метода экземпляра.

Также рекомендуется избегать использования статических методов в первую очередь; если у вас их много, он часто указывает на запах кода и должен быть реорганизован.

Смежные вопросы