Verificar se um método PHP foi chamado por meio de vinculação estática tardia

Às vezes, você pode criar um método estático em uma classe abstrata e deseja saber se ele foi chamado estaticamente por meio de um filho estendido ou não. É fácil descobrir. Veja como:

// Are we calling this from an extended class?
$extended
= (get_class() !== get_called_class());

Ótimo, está tudo bem e elegante … mas para que contexto isso é bom? Vamos ver um exemplo:

<?php

class AbstractModel {

abstract protected function getPrimaryKey();

/**
* Get the SQL-compatible statement for query ordering

*

* @param string $direction The direction to order the results in

* @static

* @access public

* @return string

*/

public static function buildOrderStatement($direction = 'DESC') {
// Are we calling this from an extended class?
$extended
= (get_class() !== get_called_class());

if ($extended) {
$column
= static::getPrimaryKey();
} else {
$column
= 'id';
}

return ($column .' '. $direction);
}
}

Dessa forma, você ainda pode chamar o método de um método externo que não estende a classe abstrata … dessa forma, você não precisa criar Utilsclasses ridículas . : P

Então, é isso:

echo AbstractModel::buildOrderStatement();

produziria um resultado diferente de:

class UserModel extends AbstractModel {
}

echo
UserModel::buildOrderStatement();

Pegue? Legal. 🙂