À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 Utils
classes ridículas . : P
Então, é isso:
echo AbstractModel::buildOrderStatement();
produziria um resultado diferente de:
class UserModel extends AbstractModel {
}
echo UserModel::buildOrderStatement();
Pegue? Legal. 🙂