1: <?php
2:
3: /**
4: * This file is part of the Nette Framework (https://nette.org)
5: * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
6: */
7:
8: namespace Nette;
9:
10: use Nette;
11:
12:
13: /**
14: * Nette\Object is the ultimate ancestor of all instantiable classes.
15: *
16: * It defines some handful methods and enhances object core of PHP:
17: * - access to undeclared members throws exceptions
18: * - support for conventional properties with getters and setters
19: * - support for event raising functionality
20: * - ability to add new methods to class (extension methods)
21: *
22: * Properties is a syntactic sugar which allows access public getter and setter
23: * methods as normal object variables. A property is defined by a getter method
24: * or setter method (no setter method means read-only property).
25: * <code>
26: * $val = $obj->label; // equivalent to $val = $obj->getLabel();
27: * $obj->label = 'Nette'; // equivalent to $obj->setLabel('Nette');
28: * </code>
29: * Property names are case-sensitive, and they are written in the camelCaps
30: * or PascalCaps.
31: *
32: * Event functionality is provided by declaration of property named 'on{Something}'
33: * Multiple handlers are allowed.
34: * <code>
35: * public $onClick; // declaration in class
36: * $this->onClick[] = 'callback'; // attaching event handler
37: * if (!empty($this->onClick)) ... // are there any handlers?
38: * $this->onClick($sender, $arg); // raises the event with arguments
39: * </code>
40: *
41: * Adding method to class (i.e. to all instances) works similar to JavaScript
42: * prototype property. The syntax for adding a new method is:
43: * <code>
44: * MyClass::extensionMethod('newMethod', function (MyClass $obj, $arg, ...) { ... });
45: * $obj = new MyClass;
46: * $obj->newMethod($x);
47: * </code>
48: *
49: * @property-read Nette\Reflection\ClassType|\ReflectionClass $reflection
50: * @deprecated use trait Nette\SmartObject
51: */
52: abstract class LegacyObject
53: {
54:
55: /**
56: * Access to reflection.
57: * @return Nette\Reflection\ClassType|\ReflectionClass
58: */
59: public static function getReflection()
60: {
61: $class = class_exists(Nette\Reflection\ClassType::class) ? Nette\Reflection\ClassType::class : 'ReflectionClass';
62: return new $class(get_called_class());
63: }
64:
65:
66: /**
67: * Call to undefined method.
68: * @param string method name
69: * @param array arguments
70: * @return mixed
71: * @throws MemberAccessException
72: */
73: public function __call($name, $args)
74: {
75: return @Nette\Utils\ObjectMixin::call($this, $name, $args); // is deprecated
76: }
77:
78:
79: /**
80: * Call to undefined static method.
81: * @param string method name (in lower case!)
82: * @param array arguments
83: * @return mixed
84: * @throws MemberAccessException
85: */
86: public static function __callStatic($name, $args)
87: {
88: return @Nette\Utils\ObjectMixin::callStatic(get_called_class(), $name, $args); // is deprecated
89: }
90:
91:
92: /**
93: * Adding method to class.
94: * @param string method name
95: * @param callable
96: * @return mixed
97: */
98: public static function extensionMethod($name, $callback = null)
99: {
100: trigger_error('Class Nette\Object and extension methods are deprecated', E_USER_DEPRECATED);
101: if (strpos($name, '::') === false) {
102: $class = get_called_class();
103: } else {
104: list($class, $name) = explode('::', $name);
105: $class = (new \ReflectionClass($class))->getName();
106: }
107: if ($callback === null) {
108: return Nette\Utils\ObjectMixin::getExtensionMethod($class, $name);
109: } else {
110: Nette\Utils\ObjectMixin::setExtensionMethod($class, $name, $callback);
111: }
112: }
113:
114:
115: /**
116: * Returns property value. Do not call directly.
117: * @param string property name
118: * @return mixed property value
119: * @throws MemberAccessException if the property is not defined.
120: */
121: public function &__get($name)
122: {
123: return Nette\Utils\ObjectMixin::get($this, $name);
124: }
125:
126:
127: /**
128: * Sets value of a property. Do not call directly.
129: * @param string property name
130: * @param mixed property value
131: * @return void
132: * @throws MemberAccessException if the property is not defined or is read-only
133: */
134: public function __set($name, $value)
135: {
136: @Nette\Utils\ObjectMixin::set($this, $name, $value); // is deprecated
137: }
138:
139:
140: /**
141: * Is property defined?
142: * @param string property name
143: * @return bool
144: */
145: public function __isset($name)
146: {
147: return @Nette\Utils\ObjectMixin::has($this, $name); // is deprecated
148: }
149:
150:
151: /**
152: * Access to undeclared property.
153: * @param string property name
154: * @return void
155: * @throws MemberAccessException
156: */
157: public function __unset($name)
158: {
159: @Nette\Utils\ObjectMixin::remove($this, $name); // is deprecated
160: }
161: }
162: