/www/libs/nette-dev/Object.php
PHP | 192 lines | 52 code | 30 blank | 110 comment | 4 complexity | ecb52047e99553f6156e64a4a44def5a MD5 | raw file
Possible License(s): BSD-3-Clause, MIT
- <?php
- /**
- * Nette Framework
- *
- * @copyright Copyright (c) 2004, 2010 David Grudl
- * @license http://nettephp.com/license Nette license
- * @link http://nettephp.com
- * @category Nette
- * @package Nette
- */
- /**
- * Nette\Object is the ultimate ancestor of all instantiable classes.
- *
- * It defines some handful methods and enhances object core of PHP:
- * - access to undeclared members throws exceptions
- * - support for conventional properties with getters and setters
- * - support for event raising functionality
- * - ability to add new methods to class (extension methods)
- *
- * Properties is a syntactic sugar which allows access public getter and setter
- * methods as normal object variables. A property is defined by a getter method
- * and optional setter method (no setter method means read-only property).
- * <code>
- * $val = $obj->label; // equivalent to $val = $obj->getLabel();
- * $obj->label = 'Nette'; // equivalent to $obj->setLabel('Nette');
- * </code>
- * Property names are case-sensitive, and they are written in the camelCaps
- * or PascalCaps.
- *
- * Event functionality is provided by declaration of property named 'on{Something}'
- * Multiple handlers are allowed.
- * <code>
- * public $onClick; // declaration in class
- * $this->onClick[] = 'callback'; // attaching event handler
- * if (!empty($this->onClick)) ... // are there any handlers?
- * $this->onClick($sender, $arg); // raises the event with arguments
- * </code>
- *
- * Adding method to class (i.e. to all instances) works similar to JavaScript
- * prototype property. The syntax for adding a new method is:
- * <code>
- * MyClass::extensionMethod('newMethod', function(MyClass $obj, $arg, ...) { ... });
- * $obj = new MyClass;
- * $obj->newMethod($x);
- * </code>
- *
- * @copyright Copyright (c) 2004, 2010 David Grudl
- * @package Nette
- *
- * @property-read string $class
- * @property-read ClassReflection $reflection
- */
- abstract class Object
- {
- /**
- * @deprecated
- */
- public function getClass()
- {
- trigger_error(__METHOD__ . '() is deprecated; use getReflection()->getName() instead.', E_USER_WARNING);
- return get_class($this);
- }
- /**
- * Access to reflection.
- *
- * @return ClassReflection
- */
- public function getReflection()
- {
- return new ClassReflection($this);
- }
- /**
- * Call to undefined method.
- *
- * @param string method name
- * @param array arguments
- * @return mixed
- * @throws MemberAccessException
- */
- public function __call($name, $args)
- {
- return ObjectMixin::call($this, $name, $args);
- }
- /**
- * Call to undefined static method.
- *
- * @param string method name (in lower case!)
- * @param array arguments
- * @return mixed
- * @throws MemberAccessException
- */
- public static function __callStatic($name, $args)
- {
- $class = get_called_class();
- throw new MemberAccessException("Call to undefined static method $class::$name().");
- }
- /**
- * Adding method to class.
- *
- * @param string method name
- * @param mixed callback or closure
- * @return mixed
- */
- public static function extensionMethod($name, $callback = NULL)
- {
- if (strpos($name, '::') === FALSE) {
- $class = get_called_class();
- } else {
- list($class, $name) = explode('::', $name);
- }
- $class = new ClassReflection($class);
- if ($callback === NULL) {
- return $class->getExtensionMethod($name);
- } else {
- $class->setExtensionMethod($name, $callback);
- }
- }
- /**
- * Returns property value. Do not call directly.
- *
- * @param string property name
- * @return mixed property value
- * @throws MemberAccessException if the property is not defined.
- */
- public function &__get($name)
- {
- return ObjectMixin::get($this, $name);
- }
- /**
- * Sets value of a property. Do not call directly.
- *
- * @param string property name
- * @param mixed property value
- * @return void
- * @throws MemberAccessException if the property is not defined or is read-only
- */
- public function __set($name, $value)
- {
- return ObjectMixin::set($this, $name, $value);
- }
- /**
- * Is property defined?
- *
- * @param string property name
- * @return bool
- */
- public function __isset($name)
- {
- return ObjectMixin::has($this, $name);
- }
- /**
- * Access to undeclared property.
- *
- * @param string property name
- * @return void
- * @throws MemberAccessException
- */
- public function __unset($name)
- {
- throw new MemberAccessException("Cannot unset the property {$this->reflection->name}::\$$name.");
- }
- }