witam,
mam taką oto klasę:
<?php
namespace Cms\Entity;
/**
* Klasa reprezentująca użytkownika
* @Table(name="users")
* @Entity
*/
class User extends \Cms\Model\Base
{
/**
* Identyfikator użytkownika
* @var integer $id
* @Column(name="id", type="integer", nullable="false")
* @Id
* @GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* Imię użytkownika
* @Column(type="string", length=64, nullable="true")
* @var string
*/
private $firstname;
/**
* Nazwisko użytkownika
* @Column(type="string", length=64, nullable="true")
* @var string
*/
private $lastname;
}
ona dziedziczy po tej klasie:
<?php
namespace Cms\Model;
/**
* Klasa bazowa dla wszystkich modeli, ktore są odzwierciedleniem tabeli w
* bazie danych
*/
class Base {
/**
* Zwraca nazwę metody 'seter'a używając konwensji camelCase
* Dla przykładu dla zmiennej o wartości 'name' zwróci: setName
* @param string $variable
* @return string
* @author Bartłomiej Kiełbasa <bartlomiej.kielbasa@gmail.com>
*/
protected function getSeterName($variable) {
return 'set' . \Cms\Text::toCamelCase($variable);
}
/**
* Zwraca nazwę metody 'geter'a używając konwensji camelCase
* Dla przykładu dla zmiennej o wartości 'name' zwróci: getName
* @param string $variable
* @return string
*/
protected function getGeterName($variable) {
return 'set' . \Cms\Text::toCamelCase($variable);
}
/**
* Metoda wywoływana, gdy zostanie wywołana metoda, która nie jest zefiniowana w klasie.
* Wykorzystuję ją, aby stworzyć metody w stylu setName setId getId itp dynamicznie
* @param string $name
* @param array $arguments
* @throws \Cms\Exception
*/
public function __call
($name, array $arguments = array()) {
if (substr($name, 0, 3) == 'set') { $variable = \Cms\Text
::fromCamelCase(substr($name, 3
));
if (isset($this->$variable) && isset($arguments[0
])) { $this->$variable = $arguments[0];
return;
}
}
if (substr($name, 0, 3) == 'get') { $variable = \Cms\Text
::fromCamelCase(substr($name, 3
));
if (isset($this->$variable)) { return $this->$variable;
}
}
throw new \Cms\Exception("Method '$name' not found");
}
}
Wizja tego co napisałem wygląda następująco:
W klasie User tworzę zmienne prywatne. W klasie Base tworzę metody, która sprawdzi, czy dana zmienna istnieje w klasie User i jeśli tak, to pozwoli wykonać metody w stylu setId oraz getId. Klas w stylu User będę miał naprawdę wiele, dlatego wolałbym uniknąć zbędnego kopiowania kodu. Metoda \Cms\Text::fromCamelCase przetwarza tekst na teksty wTymStylu