echo "C"; } public static function __callStatic($name, $arguments) { echo "c"; } function __invoke($x) { echo strtolower($x); } } $obj = new MyClass(); $obj->say('Hello'); $obj('a'); $obj = null; MyClass::say('Bye Bye'); /* Na linha 35 $obj = new MyClass(); O objeto eh criado. Sempre q um objeto eh criado, __construct() eh chamado. Como nao temos parametros no objeto, se olhamos o que __construct faz, ele nao entra no if em que verifica se ele eh diferente de null. Como eh null ele nao vai entrar no if. Na linha 36: $obj->say('Hello'); Nao temos o method say dentro da classe MyClass(). E como MyClass nao esta extendendo MyBase, nao podemos confundir com o method da MyBase. Assim que say eh chamado, o magic method __call eh executado. Assim, ele vai printar na tela: "C". Na linha 37: $obj('a'); Um pouco estranha essa sintaxe. O nome que damos a isso eh "chamar um objeto