Guest User

Untitled

a guest
Jul 25th, 2018
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.14 KB | None | 0 0
  1. <?php
  2. /*
  3. //ООП в PHP
  4. //---------------------------------
  5. //Создание класса и обьектов класса
  6. class User
  7. {
  8. public $name = 'User'; // свойство со значением по умолчанию
  9. public $email; //свойство
  10.  
  11. }
  12. $user = new User(); //обьект(экземпляр или сущьность) класса
  13. echo $user->name.'<br/>';
  14. echo $user->email.'<br/>';
  15. $user->email = 'abc@mail.ru';
  16. echo $user->email.'<br/>';
  17.  
  18. $user_2 = new User();
  19. $user_2->name = 'user2';
  20. $user_2->email = 'user2@mail.ru';
  21. echo $user_2->name.'<br/>';
  22. echo $user_2->email.'<br/>';
  23.  
  24. //---------------------------------
  25. //Конструктор, деструктор и методы
  26. class User
  27. {
  28. public $name = 'User';
  29. public $email;
  30.  
  31. public function __construct($name = false,$email = false){ //конструктор
  32. if ($name) $this->name = $name; //обращаемся к свойству класса
  33. if ($email) $this->email = $email;
  34. }
  35.  
  36. public function getName(){ //метод
  37. return $this->name;
  38. }
  39. public function getEmail(){ //метод
  40. return $this->email;
  41. }
  42. public function setName($name){ //метод
  43. $this->name = $name;
  44. }
  45. public function setEmail($email){ //метод
  46. $this->email = $email;
  47. }
  48.  
  49. public function __destruct(){ //деструктор - выполняется при удалении или завершении работа php
  50. echo "Удаляем обьект";
  51. }
  52. }
  53. $user = new User();
  54. echo $user->name.'<br/>';
  55. echo $user->email.'<br/>';
  56. echo $user->getName().'<br/>';
  57. echo $user->getEmail().'<br/>';
  58. $user->setName('michle');
  59. $user->setEmail('123@mail.ru');
  60. echo $user->getName().'<br/>';
  61. echo $user->getEmail().'<br/>';
  62.  
  63. //---------------------------------
  64. //Модификаторы доступа
  65. //public - можем обратиться откуда угодно
  66. //private - только внутри класса
  67. // protected - можем обратиться внутри класса и из производных классов(дочерних)
  68. class User
  69. {
  70. public $id = 0;
  71. private $name = 'User';
  72. public $email;
  73. protected $text;
  74.  
  75. public function __construct($name = false,$email = false){ //конструктор
  76. if ($name) $this->name = $name; //обращаемся к свойству класса
  77. if ($email) $this->email = $email;
  78. $this->id = $this->getID();
  79. }
  80.  
  81. public function getName(){ //метод
  82. return $this->name;
  83. }
  84. public function getEmail(){ //метод
  85. return $this->email;
  86. }
  87. public function setName($name){ //метод
  88. $this->name = $name;
  89. }
  90. public function setEmail($email){ //метод
  91. $this->email = $email;
  92. }
  93.  
  94. public function __destruct(){ //деструктор - выполняется при удалении или завершении работа php
  95. echo "Удаляем обьект";
  96. }
  97. public function getID(){
  98. return uniqid();
  99. }
  100. }
  101. $user = new User();
  102. echo $user->id;
  103.  
  104. //---------------------------------
  105. //Статические свойства и методы(у всех обьектов одинаковое значение, принадлежат не обьекту а классу)
  106. class Math {
  107. public const PI = 3.14;
  108. private static $counter = 0;
  109. public static function sin($x){
  110. self::$counter++;
  111. return sin($x);
  112. }
  113. public static function pi2(){
  114. self::$counter++;
  115. return self::PI**2; //обращение к текущему классу
  116. // parent::__construct - обращение к родителю
  117. }
  118. public static function getCounter(){
  119. return self::$counter;
  120. }
  121. }
  122.  
  123.  
  124. echo Math::sin(5).'<br>';
  125. echo Math::sin(5).'<br>';
  126. echo Math::sin(5).'<br>';
  127. echo Math::sin(5).'<br>';
  128. echo Math::getCounter().'<br>';
  129. // echo Math::$counter.'<br>';
  130. echo Math::pi2().'<br>';
  131. //----пример с php
  132. class Foo {
  133. public static function aStaticMethod() {
  134. return '1234';
  135. }
  136. }
  137. echo Foo::aStaticMethod();
  138. $classname = 'Foo'; //статический метод НЕ вызовится черех ->
  139. $classname = new Foo(); //статический метод вызовится черех ->
  140. echo $classname::aStaticMethod();
  141. echo $classname->aStaticMethod();
  142. //-----
  143.  
  144. //---------------------------------
  145. //Магические методы
  146. class Test{
  147. public $x = 5;
  148. }
  149. class Request{
  150. private $data;
  151. public $t;
  152.  
  153. public function __construct(Test $t){
  154. $this->data=$_REQUEST;
  155. $this->t = $t;
  156. }
  157. public function __get($name){ //будет выполнен при чтении данных из недоступных свойств.
  158. if (isset($this->data[$name])) {
  159. return $this->data[$name];
  160. }
  161. return null;
  162. }
  163. public function __set($name,$value){ //будет выполнен при записи данных в недоступные свойства.
  164. $this->data[$name] = $value;
  165. }
  166. public function __isset($name){ //будет выполнен при использовании isset() или empty() на недоступных свойствах.
  167. return isset($this->data[$name]);
  168. }
  169. public function __toString(){ //Метод __toString() позволяет классу решать, как он должен реагировать при преобразовании в строку. Например, что вывести при выполнении echo $obj;.
  170. $s = '';
  171. foreach ($this->data as $key => $value) {
  172. $s.= "$key = $value;";
  173. }
  174. return $s;
  175. }
  176.  
  177. public function __clone(){ //После завершения клонирования, если метод __clone() определен, тогда будет вызываться метод __clone() вновь созданного объекта, для возможного изменения всех необходимых свойств.
  178. $this->t = clone $this->t; //если этого не сделать, то при клонировании обьекта и при измении своиств внутреннего обьекта, измениться и сам класс внутренного обьекта
  179. }
  180.  
  181. public function __call($method,$args){ //запускается при вызове недоступных методов в контексте объект.
  182. echo "$method не существует";
  183. echo "Переданные параметры: ".print_r($args,true);
  184. }
  185.  
  186. public function __unset($name){ //Метод __unset() будет выполнен при вызове unset() на недоступном свойстве.
  187. unset($this->data[$name]);
  188. }
  189. }
  190.  
  191. $req=new Request(new Test());
  192. echo $req->a.'<br>';
  193.  
  194. $req->a = 5;
  195. echo $req->a.'<br>';
  196.  
  197. echo(isset($req->a)).'<br>';
  198. echo($req).'<br>';
  199.  
  200. $req2 = $req; //req2 - жесткая ссылка на обьект $req, если изменить какое либо свойство у $req то и у $req2 измениться
  201. $req2 = clone $req; // - $req2 новый обьект класса
  202. echo $req2->a; //выведет 15
  203. echo "<br>-------<br>";
  204. echo $req->t->x.'<br>';// выведет 5
  205.  
  206. echo $req->donthaveit(123,'123dfg');
  207.  
  208. unset ($req->a);
  209. echo $req->a;
  210.  
  211.  
  212. //---------------------------------
  213. //Cериализация объектов
  214. class User{
  215. public $email;
  216. public $password;
  217. public $lt;
  218.  
  219. public function __construct($email,$password){
  220. $this->email = $email;
  221. $this->password = $password;
  222. $this->lt = time();
  223. }
  224. public function __sleep(){ //Функция serialize() проверяет, присутствует ли в вашем классе метод с магическим именем __sleep(). Если это так, то этот метод выполняется до любой операции сериализации.
  225. return['email','lt'];
  226. }
  227. public function __wakeup(){ //С другой стороны, функция unserialize() проверяет наличие метода с магическим именем __wakeup(). Если она имеется, эта функция может восстанавливать любые ресурсы, которые может иметь объект.
  228. $this->lt = time();
  229. }
  230.  
  231. }
  232.  
  233. $user = new User('abc@mail.ru','123');
  234.  
  235. print_r($user);
  236. echo "<br>";
  237. sleep(2);
  238. $str = file_get_contents($user->email);
  239. $u = unserialize($str);
  240. print_r($u);
  241.  
  242. $str = serialize($user);
  243. echo($str);
  244. file_put_contents($user->email, $str);
  245.  
  246.  
  247. //---------------------------------
  248. //Механизм наследования и абстрактные классы
  249. abstract class Shape{ //абстрактный класс нельзя вызвать, создать обьект
  250. protected $x;
  251. protected $y;
  252.  
  253. abstract public function draw(); //данный метод обязательно должен быть реализован в дочерних классах
  254. }
  255. class Circle extends Shape{ //дочерний класс от класса Shape, берем все свойства и методоты родительскоего класса
  256. private $r;
  257.  
  258. public function __construct($x,$y,$r){
  259. $this->x = $x;
  260. $this->y = $y;
  261. $this->r = $r;
  262. }
  263.  
  264. public function draw(){
  265. echo "рисуем".$this->x.' и '.$this->y;
  266. echo "радиус ". $this->r;
  267. }
  268. }
  269. class Rectangle extends Shape{
  270. private $w;
  271. private $h;
  272.  
  273. public function __construct($x,$y,$w,$h){
  274. $this->x = $x;
  275. $this->y = $y;
  276. $this->w = $w;
  277. $this->h = $h;
  278. }
  279.  
  280. public function draw(){
  281. echo "рисуем от класса Rectangle".$this->x.' и '.$this->y;
  282. echo "шиирина ".$this->w.' высота '.$this->h;
  283. }
  284. }
  285.  
  286. $circle = new Circle(5,8,10);
  287. $rect = new Rectangle(20,20,40,10);
  288. $r = new Rectangle(210,210,440,105);
  289. echo($circle->draw()).'<br>';
  290. echo($rect->draw());
  291. $list = [$circle,$rect,$r];
  292. foreach ($list as $value) {
  293. if ($value instanceof Circle){}//ператор instanceof используется для определения того, является ли текущий объект экземпляром указанного класса.
  294. $value->draw();
  295. echo "<br>";
  296. }
  297. //магические методы, описанные в родительском элементе также наследуются в дочерние
  298.  
  299. //---------------------------------
  300. //Интерфейсы php7
  301. //тот функцианал, который гарантированно будет у наших классов
  302. interface Draw{
  303. public function draw(); //все методы должны быть реализованы, за исключение абстрактного класса
  304. }
  305. interface test2{
  306. public function test2();
  307. }
  308. interface test3{
  309. public function test3();
  310. }
  311. abstract class Shape implements Draw,test2,test3{
  312. protected $x;
  313. protected $y;
  314. }
  315.  
  316. //---------------------------------
  317. //Трейты
  318. //можно использовать много в одном классе
  319. // нельзя создавать обьекты от трейдов
  320. // можно реализовать методы(в интерфейсах нельзя)
  321. trait Id{
  322. protected $id;
  323.  
  324. public function getId(){
  325. return $this->id;
  326. }
  327.  
  328. public function setId($id){
  329. $this->id = $id;
  330. }
  331. }
  332. trait Name{
  333. protected $name;
  334.  
  335. public function getName(){
  336. return $this->name;
  337. }
  338.  
  339. public function setName($name){
  340. $this->name = $name;
  341. }
  342. }
  343.  
  344.  
  345. class User
  346. {
  347. use Id,Name;
  348. }
  349. $user = new User();
  350. $user->setId(4);
  351. $user->setName('denko');
  352. echo $user->getId().'<br>';
  353. echo $user->getName().'<br>';
  354.  
  355. //---------------------------------
  356. //Пространство имен
  357. use ru\sitename\User;//использование класса который назодится по такому классу имен
  358. use ru\google\User as google_user;
  359.  
  360. require_once 'a.php';
  361. require_once 'b.php';
  362.  
  363. $user =new ru\sitename\User(); //обращение по пространству имен
  364. $user->name = 'denko';
  365. echo $user->name ;
  366.  
  367. $user =new ru\google\User(); //обращение по пространству имен
  368. $user->id = 10;
  369. echo $user->id ;
  370.  
  371. $user =new User(); //обращение по к подключенному классу
  372. $user->name = 'test';
  373. echo $user->name ;
  374.  
  375. $user =new google_user(); //обращение к подключенному классу
  376. $user->id = 15;
  377. echo $user->id ;
  378. */
  379. //---------------------------------
  380. //Импортирование и автозагрузка классов и файлов
  381. // function __autoload($classname){
  382. // require_once $_SERVER['DOCUMENT_ROOT']."/4_1++/lib/{$classname}_class.php";
  383. // }
  384. set_include_path(get_include_path().PATH_SEPARATOR.'lib'.PATH_SEPARATOR.'lib2'.PATH_SEPARATOR.'lib3');// Устанавливает значение настройки конфигурации include_path ->Указывает список директорий, в которых функции require, include, fopen(), file(), readfile() и file_get_contents() ищут файлы.
  385. //get_include_path() - получение скписка директорий
  386. // PATH_SEPARATOR - разделитель
  387.  
  388. spl_autoload_extensions('_class.php'); //Регистрация и вывод расширений файлов для spl_autoload
  389. //производит поиск в директориях get_include_path()
  390. spl_autoload_register(); //Регистрирует заданную функцию в качестве реализации метода __autoload()
  391.  
  392. // echo get_include_path();
  393.  
  394. $user = new User();
  395. echo $user->name.'<br>';
  396. echo $user->email.'<br>';
  397.  
  398. $user = new Point();
  399. echo $user->x.'<br>';
  400. echo $user->y.'<br>';
  401. ?>
Add Comment
Please, Sign In to add comment