Programacion orientada a objetos y diagramas UML en PHP
Una recopilación de como construir clases en PHP junto a un diagrama de la relación UML. Útil para ir obteniendo nociones sobre el modelado del código.
Herencia
Indica que una clase hereda todos los atributos y métodos de otra, hay que tener en cuenta que en el diagrama UML el triangulo toca al padre:
class Senior {
}
class Junior extends Senior {
}

Agregación
Es cuando una clase puede es parte de otra, con lo cual esta primera clase tendrá acceso a los métodos de la segunda. Al haber sido instanciada fuera de la segunda, aunque esta muera la primera seguira viviendo. Se les conoce como clases “Data Access”, y se dice que la primera clase controla parte de la segunda. Se relacionan con un diamante que toca la clase controlada
class Dao {
function getSomething() {
}
}
class Model {
var $dao;
function Model (& $dao) {
$this->dao=& $dao;
}
function doSomething () {
$this->dao->getSomething();
}
}
$dao=new Dao;
$model=new Model($dao);
$model->doSomething();

Composición
Es cuando una clase instancia a otra, esta segunda instancia moriria con la primera, esto significa que la primera clase controla a toda la segunda, se representa con un solido diamante tocando a la clase controlada.
class LinkWidget {
}
class View {
var $linkWidget;
var $page;
function View () {
$this->linkWidget=new LinkWidget;
}
function renderPage () {
$this->page=$this->linkWidget->display()
}
}

Mensajes
Es cuando una clase comunica a otra que está controlando una instancia suya. En php suele emplearse el operador scope. Que sirve para hacer referencias a métodos de clases que no estan instanciadas.
class HtmlUtils {
function unHtmlEntities ($str) {
$trans_tbl =
get_html_translation_table (HTML_ENTITIES);
$trans_tbl = array_flip ($trans_tbl);
return strtr ($str, $trans_tbl);
}
}
class View {
function renderPage {
$text=HtmlUtils::unHtmlEntities($text);
}
}

Existe otra variante de esta relación, donde el mensaje se envia mutuamente entre las dos clases, un ejemplo de código:
class Debug {
function display () {
echo ($this->errorMsg);
}
}
class SomeClass {
var $errorMsg='This is an error message';
function someFunction () {
if ( DEBUG == 1 ) {
Debug::display();
}
}
}
define ('DEBUG',1);
$someClass= &new SomeClass;
$someClass->someFunction();

Fuente, phppatterns