Задачи по PHP
http://belarusweb.net
Основы создания сайтов

Упражнения и задачи по PHP 7





§1.1. Введение в PHP

1.1.1. Создайте на локальном сервере Xampp в папке htdocs тестовую папку test, а в ней файл index.php. Для быстрого доступа к файлу создайте в браузере закладку, поскольку файл будет использоваться в дальнейшем для решения задач. Адресный путь к файлу должен иметь вид http://localhost/test/index.php.

1.1.2. Выведите на экран одна за другой четыре строки: 'Всем ', 'привет ', 'от ', 'PHP!<br><br>', используя для этого только один оператор echo. После данной инструкции напишите два однострочных комментария: 'Для вывода слов на разных строках мы используем элемент "br", т.е разрыв строки' и 'Переменные выводимые оператором echo перечисляются через запятую'. Далее измените код первой части так, чтобы слова после вывода на экран находились на разных строках. В самом конце нашего кода напишите многострочный комментарий: 'После каждой инструкции мы будем ставить точку с запятой даже, если инструкция является последней в блоке php-кода!'. Показать решение.

<?php 
echo 'Всем ', 'привет ', 'от ', 'PHP!<br><br>';

//Для вывода слов на разных строках мы используем элемент "br", т.е разрыв строки
//Переменные выводимые оператором echo перечисляются через запятую

echo 'Всем<br>', 'привет<br>', 'от<br>', 'PHP!';

/* После каждой инструкции мы будем ставить точку с запятой даже, если инструкция 
	является последней в блоке php-кода! */
?>

Решение задачи №1.1.2

1.1.3. Создайте переменную, присвойте ей число 5 и выведите его на экран. Создайте вторую переменную, присвойте ей число 10 и выведите его на экран. Выведите на экран сумму, разность, произведение и частное от деления значения первой переменной на значение второй переменной. Присвойте сумму значений этих двух переменных третьей и выведите итог на экран. Теперь увеличьте текущее значение третьей переменной на величину значения второй переменной и выведите его на экран. И, наконец, увеличьте текущее значение третьей переменной в два раза и выведите его на экран. Показать решение.

<?php 
$a=5; 	  //Создали переменную $a и присвоили ей число 5
echo 'Переменная $a имеет значение ', $a,'<br>';

$b=10; 	  //Создали переменную $b и присвоили ей число 10
echo 'Переменная $b имеет значение ', $b,'<br>';

echo 'Сумма переменных $a и $b равна ', $a+$b,'<br>';
echo 'Разность переменных $a и $b равна ', $a-$b,'<br>';
echo 'Произведение переменных $a и $b равно ', $a*$b,'<br>';
echo 'Частное от деления переменной $a на $b равно ', $a/$b,'<br>';

$c=$a+$b; //Создали переменную $c и присвоили ей сумму переменных $a и $b
echo 'Сумма переменных $a и $b равна ', $c,'<br>'; 

$c=$c+$b; //Увеличиваем текущее значение $c на величину значения $b
echo 'Теперь значение $c равно  ', $c,'<br>';

$c=2*$c;  //Увеличиваем текущее значение $c в два раза
echo 'Теперь значение $c равно  ', $c;
?>

Решение задачи №1.1.3

1.1.4. Восстановите по комментариям php-код условия. Показать решение.

<?php 
/* Присвоение переменной по значению. После каждой операции старайтесь 
смотреть результат в браузере, используя для вывода оператор echo */

//Присвоили переменной $a число 15
	
//Присвоили переменной $b переменную $a, теперь $b==$a==15 

//Изменили значение переменной $b на 'new', при этом 
//значение переменной $a не изменилось ($a==15) 

//Опять присвоили переменной $b переменную $a, теперь $b==15 

//Изменили значение переменной $a на 'sos', при этом 
//значение переменной $b не изменилось ($b==15) 

/* Таким образом, переменная, присвоенная по значению, не зависит от 
переменной, которой она была присвоена */		  
?>

Условие задачи №1.1.4

<?php
/* Присвоение переменной по значению. После каждой операции старайтесь 
смотреть результат в браузере, используя для вывода оператор echo */

$a=15;    //Присвоили переменной $a число 15
	
$b=$a;    //Присвоили переменной $b переменную $a, теперь $b==$a==15 

$b='new'; //Изменили значение переменной $b на 'new', при этом 
		  //значение переменной $a не изменилось ($a==15) 

$b=$a;    //Опять присвоили переменной $b переменную $a, теперь $b==15 

$a='sos'; //Изменили значение переменной $a на 'sos', при этом 
		  //значение переменной $b не изменилось ($b==15) 

/* Таким образом, переменная, присвоенная по значению, независит от 
переменной, которой она была присвоена */		  
?>

Решение задачи №1.1.4

1.1.5. Восстановите по комментариям php-код условия. Показать решение.

<?php 
/* Присвоение переменной по ссылке. После каждой операции старайтесь 
смотреть результат в браузере, используя для вывода оператор echo */

//Инициализировали переменную $c присвоив ей значение 10

//Присвоили по ссылке переменной $b переменную $c, 
//теперь $b==$c==5. 

//Изменили значение переменной $b на 'new_2', теперь 
//$b=='new_2' и $c также равна 'new_2' 

//Изменили значение переменной $c на число 20, теперь 
//$c==20 и $b также изменилась ($b==20)

/* Таким образом, можно сказать, что переменная, присвоенная по ссылке, 
просто является псевдонимом переменной, которой она была присвоена */		  
 ?>

Условие задачи №1.1.5

<?php 
/* Присвоение переменной по ссылке. После каждой операции старайтесь 
смотреть результат в браузере, используя для вывода оператор echo */

$c=10; 		//Инициализировали переменную $c присвоив ей значение 10

$b=&$c; 	//Присвоили по ссылке переменной $b переменную $c, 
			//теперь $b==$c==5. 

$b='new_2'; //Изменили значение переменной $b на 'new_2', теперь 
			//$b=='new_2' и $c также равна 'new_2' 

$c=20; 	 	//Изменили значение переменной $c на число 20, теперь 
			//$c==20 и $b также изменилась ($b==20)

/* Таким образом, можно сказать, что переменная, присвоенная по ссылке, 
просто является псевдонимом переменной, которой она была присвоена */		  
 ?>

Решение задачи №1.1.5

1.1.6. Создайте переменную $a и присвойте ей значение 10. Создайте переменную $b и присвойте ей значение 20. Теперь создайте переменную $car и присвойте ей строку с именем первой переменной. Выведите на экран ${$car}. Создайте еще одну переменную $track и присвойте ей строку с именем второй переменной. Выведите на экран ${$track}. Показать решение.

<?php 
$a=20; 	 	//Присвоили переменной $a количество 20
$b=10;    	//Присвоили переменной $b количество 10

$car='a';	//Присвоили переменной $car в качестве значения 
			//строку с именем первой переменной
echo 'Количество проданных машин: ', ${$car}, '.<br>'; 

$track='b'; //Присвоили переменной $track в качестве значения 
			//строку с именем второй переменной
echo 'Количество проданных грузовиков: ', ${$track}, '.';

			/* 	Переменные переменных  */
?>

Решение задачи №1.1.6

1.1.7. Создайте переменную $n и присвойте ей строку 'number'. Теперь попробуйте вывести на экран строку '$a'. Что нужно сделать, чтобы переменная, находящаяся внутри строки была правильно распознана интерпретатором PHP? Исправьте код и выведите строку на экран повторно. Показать решение.

<?php 
//Интерполяция переменных в строках

$a='number'; 	 		//Теперь $a=='number' 
echo '$a', '<br>'; 	  //Выведет просто '$a' вместо строки 'number', т.к. 
						//PHP видит переменные только внутри двойных кавычек 

echo "{$a}s", '<br>';   //Выведет 'numbers' 

echo '{$a}s', '<br>';   //Выведет просто '{$a}s', т.к. кавычки одинарные 

echo "New { $a}"; 		//Выведет 'New { number}' вместо 'New number', 
						//т.к. пробела между '{' и '$' быть не должно  
?>

Решение задачи №1.1.7

1.1.8. Посмотрите внимательно на условие задачи, в котором сделана попытка вывода значений переменных на экран. При попытке вывода каких из переменных интерпретатором будет выдана ошибка и почему? Показать решение.

<?php 
//Локальные и глобальные переменные

$a=1;

function m_func(){  //Объявили новую пользовательскую функцию m_func()            
	$b=2; 
	echo $a;
}            

$c=3;
   
echo $a.'<br>'; 
echo $b.'<br>';                 
echo $c;
m_func(); 
?>

Условие задачи №1.1.8

<?php 
//Локальные и глобальные переменные

$a=1;				//Создали глобальную переменную и присвоили ей значение

function m_func(){  //Объявили новую пользовательскую функцию m_func()            
   $b=2;  			//Создали локальную переменную и присвоили ей значение
	echo $a;		//Интерпретатор выведет ошибку при вызове функции, 
					//т.к. делается попытка обращения к глобальной
					//переменной из локальной области видимости
}            

$c=3; 				//Создали еще одну глобальную переменную и присвоили ей значение
   
echo $a.'<br>'; 
echo $b.'<br>';	  //Интерпретатор выведет ошибку, т.к. делается попытка обращения
					//к локальной переменной из глобальной области видимости
echo $c;
m_func(); 			//Здесь выведет ошибку 
?>

Решение задачи №1.1.8

1.1.9. Создайте две глобальные переменные и присвойте им в качестве значений числа. Затем создайте пользовательскую функцию, которая будет выводить сумму значений этих глобальных переменных (используйте ключевое слово global). Выведите результат сложения на экран. Показать решение.

<?php 
//Локальные и глобальные переменные

$a=1;					//Создали первую глобальную переменную и присвоили ей число
$b=2;					//Создали вторую глобальную переменную и присвоили ей число

function m_func(){//Объявили пользовательскую функцию m_func()            
 global $a, $b;	//Указываем, что будут использоваться глобальные переменные
 echo $a+$b;		
}            

m_func(); 			//Вызываем функцию и выводим результат сложения на экран
?>

Решение задачи №1.1.9

1.1.10. Создайте глобальную переменную $a и присвойте ей число 1. Затем создайте пользовательскую функцию, внутри которой создайте локальную статическую переменную $b и присвойте ей число 0. Далее увеличьте текущее значение локальной переменной $b на величину значения глобальной переменной $a, т.е. прибавьте к текущему значению переменной $b значение глобальной переменной $a. Добавьте инструкцию вывода значения переменной $b на экран. После создания функции вызовите ее три раза и объясните результат. Показать решение.

<?php 
//Статические и глобальные переменные 

$a=1;				 //Создаем глобальную переменную				

function m_func(){   //Создаем пользовательскую функцию          
	global $a; 		 //Будем испольовать глобальную переменную
	static $b=0;	 //Создаем статическую локальную переменную
	$b=$b+$a;		 //Увеличиваем текущее значение $b на значение $a
	echo $b, '<br>'; //Выводим его на экран при вызове функции
} 

m_func();			 //Вызываем функцию три раза
m_func();
m_func();          
?>

Решение задачи №1.1.10

1.1.11. Имена каких из переменных, указанных в условии, заданы неверно? Почему? Показать решение.

<?php 
//Правила записи имен 
$a=1;					
$B=2;	
$b=3;
$first.number=4;
$firstNumberOf=5;				

function m_func(){           
	$_local=1;
	$locAl=2;
	$local_var=3;
	$10_local_var=4;
	$local_Var=5;
	$local Var=6;
} 

function 5_func(){           
	$___a_A=10;
}            
?>

Условие задачи №1.1.11

<?php 
//Правила записи имен 

$a=1;	//Верно				
$B=2;	//Верно
$b=3;	//Верно
$first.number=4; 	//Не верно (недопустимый символ)
$firstNumberOf=5;	//Верно (верблюжья нотация)			

function m_func(){           
	$_local=1;		//Верно
	$locAl=2;		//Верно (верблюжья нотация)
	$local_var=3;	//Верно (змеиная нотация)
	$10_local_var=4;  //Не верно (начинать с числа запрещено)
	$local_Var=5;	  //Верно (смесь)
	$local Var=6; 	  //Не верно (пробелы запрещены)
} 

function 5_func(){   //Не верно (начинать с числа запрещено)         
	$___a_A=10;		 //Верно (смесь)
}

/* Для просмотра в браузере закомментируйте неверные инструкции, а затем 
поочередно раскомментируйте их и посмотрите результат  */            
?>

Решение задачи №1.1.11

1.1.12. Создайте две константы, использовав для этого функцию define() и служебное слово const. Выведите их значения на экран. Создайте пользовательскую функцию, которая будет создавать константу в локальной области видимости этой функции. Получится ли создать константу при помощи служебного слова const? Осуществите вызов созданной функции. Выведите значение константы, созданной после вызова функции, на экран. Вызовите функцию еще раз. Объясните результат. Показать решение.

<?php 
//Создание констант 

define('a', 7);		 	  //Создаем числовую константу				
const b='string';		  //Создаем строковую константу

echo 'Значение константы a равно ', a, '<br>'; //Выводим  на экран
echo 'Значение константы b равно ', b, '<br>'; //Выводим  на экран

function m_func(){        //Создаем пользовательскую функцию          
  define('d', 'like'); 	  //Создаем константу в локальной области видимости
//const m='like';		  //А вот так делать запрещено
} 

m_func(); 				  //Вызываем функцию, которая создает константу d
echo d;				  	  //Выводим значение константы d на экран 

	/* При повторном вызове функции будет выведено предупреждение о том, 
		что такая константа уже создана   */      
?>

Решение задачи №1.1.12

1.1.13. Создайте три переменные. Удалите при помощи функции unset() первую переменную и попробуйте вывести ее значение на экран. Удалите одновременно оставшиеся переменные, передав их функции в качестве аргументов через запятую. Попробуйте вывести их значения на экран. Показать решение.

<?php 
$a=1;  			//Создаем первую переменную и присваиваем ей значение
$b=2;  			//Создаем вторую переменную и присваиваем ей значение
$c=3;  			//Создаем третью переменную и присваиваем ей значение

unset($a);		//Удалили первую переменную
echo $a;   		//Выведет ошибку, т.к. переменной больше не существует

unset($b, $c);	//Удалили две переменные сразу
echo $b;   		//Выведет ошибку, т.к. переменной больше не существует
echo $c;   		//Выведет ошибку, т.к. переменной больше не существует
?>

Решение задачи №1.1.13

§1.2. Типы данных

1.2.1. Создайте переменные, присвоив им логические значения true и false, вещественное число 43.658+e2, но предварительно записав его в обычном виде, и корень квадратный из отрицательного числа, например, sqrt(-2). Выведите значения всех переменных на экран. Показать решение.

<?php 
$a=true; 	//Присвоили логическое значение true
$b=false; 	//Присвоили логическое значение false
$f=4365.8;  //Присвоили вещественное число
$z=sqrt(-2);//Присвоили корень квадратный из -2

echo $a, '<br>'; //Выведет 1, т.к. true преобразуется в строку '1'
echo $b, '<br>'; //Выведет пустую строку, т.к. false преобразуется в ''
echo $z, '<br>'; //Выведет NAN
echo $f;  		 //Выведет 4365.8, точнее строку '4365.8'
?>

Решение задачи №1.2.1

1.2.2. Создайте три переменные и присвойте им строки: 'Добро ', 'побеждает ', 'зло'. Создайте еще одну переменную и присвойте ей объединенную строку (для конкатенации строковых переменных используйте обычную точку). Выведите ее на экран. Показать решение.

<?php 
$a='Добро '; 		 //Присвоили первую строку
$b='побеждает '; 	 //Присвоили вторую строку
$c='зло '; 			 //Присвоили третью строку
$d=$a.$b.$c; 		 //Присвоили объединенную строку

echo $d, '<br>';     //Выведет 'Добро побеждает зло'
?>

Решение задачи №1.2.2

1.2.3. Создайте переменную и присвойте ей строку "На манёврах "красные" выступали против "синих"", предварительно экранировав двойные кавычки внутри двойных во избежание ошибки. Выведите строку на экран. Как еще можно поступить для вывода строк, содержащих внутри себя двойные или одинарные кавычки, чтобы не использовать их экранирование? Показать решение.

<?php 
$a="На манёврах \"красные\"  выступали против \"синих\"";  
echo $a, '<br>';   //Выведет На манёврах "красные"  выступали против "синих"

$b='На манёврах "красные"  выступали против "синих"';  
echo $b;   		   //Выведет тоже самое

	/* Также разрешается использование одинарных кавычек внутри двойных 
		либо наоборот без необходимости их экранирования */
?>

Решение задачи №1.2.3

1.2.4. Создайте переменную $number и присвойте ей число 125. Затем создайте еще две переменные, присвоив им строки "Я число $number", но использовав для этого синтаксисы heredoc и nowdoc. Выведите строки на экран и сравните результаты. Показать решение.

<?php 
$number=125; 

//Используем синтаксис heredoc
$str_1=<<<HD
Я число $number<br>
HD;
echo $str_1;		//Выведет 'Я число 125'

//Используем синтаксис nowdoc
$str_2=<<<'ND'
Я число $number<br>
ND;
echo $str_2;	    //Выведет 'Я число $number'

/* Обратите внимание, что после идентификаторов 
	HD и 'ND' нельзя писать даже комментарии! */
?>

Решение задачи №1.2.4

1.2.5. Создайте переменную $m_1 и присвойте ей массив, созданный при помощи конструкции array() и содержащий два элемента с ключами 'фрукты' и 'овощи' и соответствующими значениями 'апельсины' и 'помидоры'. Выведите на экран значение элемента массива с ключем 'фрукты'. Проделайте все тоже самое, но использовав переменную $m_2 и создав массив при помощи синтаксиса квадратных скобок. Показать решение.

<?php 
$m_1=array( 
      'фрукты'=>'апельсины',  	// Создали одномерный массив с двумя 
      'овощи'=>'помидоры'    	//элементами и присвоили его переменной 
     );                      	 //Не забываем про точку с запятой!
 
echo $m_1["фрукты"]."<br>";	   //Выведет строку 'апельсины'
      
$m_2=[ 
        'фрукты'=>'апельсины',   // Создали одномерный массив при  
        'овощи'=>'помидоры'      // помощи квадратных скобок 
     ];  
 
echo $m_2["фрукты"]."<br>";      //Выведет строку 'апельсины'
?>

Решение задачи №1.2.5

1.2.6. Создайте переменную $m_1 и присвойте ей массив, состоящий из двух элементов (ключи не указывайте). Выведите на экран значение второго элемента массива (не забываем, что нумерация элементов массива начинается с нуля). Добавьте в массив третий элемент, также не указывая его ключ. Выведите его значение на экран. Добавьте в массив еще один элемент, указав в качестве ключа число 5. Выведите его значение на экран. Показать решение.

<?php 
$m_1=[56, 33];  		//Присвоили переменной массив с двумя элементами
echo $m_1[1]."<br>"; 	  //Выведет 33

$m_1[]=10;				//Добавили в массив еще один элемент
echo $m_1[2]."<br>"; 	  //Выведет 10
 
$m_1[5]=50;				//Добавили в массив элемент с ключем 5
echo $m_1[5]."<br>";	  //Выведет 50
?>

Решение задачи №1.2.6

1.2.7. Посмотрите на условие задачи. При попытке вывода каких элементов массива будут выведены ошибки и почему? Показать решение.

<?php 
$m_3=[4=>56, 33];  	

$m_3[]=30;				
$m_3[8]=80;				
$m_3[]=100;				

echo $m_3[3]."<br>"; 
echo $m_3[4]."<br>";
echo $m_3[5]."<br>";
echo $m_3[6]."<br>";
echo $m_3[7]."<br>";
echo $m_3[8]."<br>";
echo $m_3[9]."<br>";
?>

Условие задачи №1.2.7

<?php 
$m_3=[4=>56, 33];  	   //Присвоили переменной массив с двумя элементами

$m_3[]=30;				//Добавили в массив еще один элемент
$m_3[8]=80;				//Добавили в массив элемент с ключем 8
$m_3[]=100;				//Добавили в массив еще один элемент

//echo $m_3[3]."<br>";  //Элемента не существует, нумерация начинается с 4
echo $m_3[4]."<br>";	  //Выведет 56
echo $m_3[5]."<br>";	  //Выведет 33
echo $m_3[6]."<br>";	  //Выведет 30
//echo $m_3[7]."<br>";  //Элемента не существует, добавлен элемент с ключем 8
echo $m_3[8]."<br>";	  //Выведет 80
echo $m_3[9]."<br>";	  //Выведет 100
?>

/* Раскомментируйте неправильные инструкции и посмотрите результат */

Решение задачи №1.2.7

1.2.8. Создайте массив с двумя элементами. Измените значение первого элемента и выведите его на экран. Добавьте в массив еще один элемент в виде пустой строки и выведите его на экран. Добавьте в качестве нового элемента массива другой массив с тремя элементами и выведите на экран значение второго элемента этого массива. Показать решение.

<?php 
$m_4=[10, 20];  			//Присвоили переменной массив с двумя элементами

$m_4[0]=30;					//Изменили первый элемент массива
echo $m_4[0]."<br>";	      //Выведет 30

$m_4[]='';					//Добавили в качестве элемента массива пустую строку
echo $m_4[2]."<br>";	   	  //Выведет пустую строку, т.е. элемент существует

$m_4[]=[5,7,9];				//Добавили элемент, который сам является массивом
echo $m_4[3][1]."<br>";	  //Выведет 7
?>

Решение задачи №1.2.8

1.2.9. Создайте массив с четырьмя элементами. Удалите второй элемент массива, использовав для этого функцию unset(). Попытайтесь вывести удаленный элемент на экран. Теперь удалите последние два элемента массива, передав их в качестве аргументов функции unset() через запятую. Попробуйте вывести на экран удаленный последний элемент массива. И, наконец, добавьте в массив элемент, который сам является массивом с двумя элементами. Удалите первый элемент добавленного массива и затем попробуйте вывести его на экран. Также выведите на экран оставшийся элемент добавленного массива. Показать решение.

<?php 
$m_5=[1,2,3,4];  		 //Присвоили переменной массив с 4 элементами

unset($m_5[0]);			 //Удалили первый элемент массива
echo $m_5[0]."<br>";	   //Выведет ошибку, т.к. элемента больше не существует

unset($m_5[2], $m_5[3]); //Удалили последние два элемента массива
echo $m_5[3]."<br>";	   //Выведет ошибку, т.к. элемента больше не существует

$m_5[]=[5,7];			 //Добавили элемент, который сам является массивом
unset($m_5[4][0]);		 //Удалили первый элемент массива, который сам  
						 //является элементом массива

echo $m_5[4][0]."<br>";  //Выведет  ошибку, т.к. элемента больше не существует
echo $m_5[4][1]."<br>";  //Выведет  7

/* Обратите внимание, что после удаления последних элементов массива и  
добавлении нового, ему присвоился ключ 4, а не 1, т.е. ключи 1,2,3 удаленных  
элементов остались зарезервированы интерпретатором */
?>

Решение задачи №1.2.9

1.2.10. Посмотрите на условие задачи и скажите, какие значения будут присвоены переменным после преобразования типов? Что будет выведено на экран при помощи оператора echo? Не забывайте, что оператор перед выводом преобразует все значения в строки! Показать решение.

<?php 
$var_1=true;               
$var_2=false;              
 
$var_3=(integer) $var_1;   
$var_4=(integer) $var_2;   
 
$var_5=(string) $var_1;    
$var_6=(string) $var_2;   
 
//------------------------------------------------
 
$var_7="-1";               
$var_8=".9e2";          
 
$var_9=(bool) $var_7;      
$var_10=(integer) $var_8;   
 
//------------------------------------------------
 
$var_11="яблоко";             
$var_12=1.9e-2;             
 
$var_13=(array) $var_11;     
$var_14=(array) $var_12;     
?>

Условие задачи №1.2.10

<?php 
$var_1=true;               //Присвоили логическое значение true
$var_2=false;              //Присвоили логическое значение false
 
$var_3=(integer) $var_1;   //Приводим к целочисленному типу, теперь $var_3==1
echo $var_3.'<br>';     	 //Выведет 1
$var_4=(integer) $var_2;   //Приводим к целочисленному типу, теперь $var_4==0
echo $var_4.'<br>';     	 //Выведет строку '0'

$var_5=(string) $var_1;    //Приводим к строковому типу, теперь $var_5=="1"
echo $var_5.'<br>';     	 //Выведет 1
$var_6=(string) $var_2;    //Приводим к строковому типу, теперь $var_6==""
echo $var_6.'<br>';     	 //Выведет пустую строку
 
//------------------------------------------------
 
$var_7="-1";               //Присвоили строку "-1"
$var_8=".9345E3";          //Присвоили строку ".9345E3"
 
$var_9=(bool) $var_7;      //Приводим к логическому типу
echo $var_9.'<br>';     	 //Выведет 1
$var_10=(integer) $var_8;  //Приводим к целочисленному типу
echo $var_10.'<br>';     	 //Выведет 0

//------------------------------------------------
 
$var_11="яблоко";           //Присвоили строку "яблоко"
$var_12=1.9e-2;             //Присвоили вещественное число, тоже 
                            //самое, что и 0.019
 
$var_13=(array) $var_11;    //Приводим к типу array, теперь $var_13==["яблоко"]
echo $var_13[0].'<br>';     //Выведет строку 'яблоко'
$var_14=(array) $var_12;    //Приводим к типу array, теперь $var_14==[0.019]
echo $var_14[0];     		//Выведет строку '0.019'
?>

Решение задачи №1.2.10

§1.3. Выражения и операторы

1.3.1. Какие значения будут присвоены переменным в результате вычисления выражений? Выведите их на экран. Показать решение.

<?php 
$a=5+6*5;
$b=(5+6)*5;
$c=$b%7;
$d=-5%(-2);

$e=5.5/2;
$f=5.5%2;

$h=[2,4,'one']+[5,6,7,8];
?>

Условие задачи №1.3.1

<?php 
$a=5+6*5;
echo $a.'<br>';     //Выведет 35 (5+30)

$b=(5+6)*5;
echo $b.'<br>';     //Выведет 55 (11*5)

$c=$b%7;
echo $c.'<br>';     //Выведет остаток от деления, т.е. 6

$d=-5%(-2);
echo $d.'<br>';     //Выведет остаток от деления со знаком делимого, т.е. -1

$e=5.5/2;
echo $e.'<br>';     //Выведет 2.75

$f=5.5%2;
echo $f.'<br>';     //Выведет остаток от деления целого числа 5 на 2, т.е. 1

$h=[2,4,'one']+[5,6,7,8]; //Получим массив, который будет состоять из элементов 
						  //первого массива и элементов второго, ключей которых 
						  //нет в первом массиве
echo $h[0].'<br>';  		//Выведет 2
echo $h[3];     		  //Выведет 8
?>

Решение задачи №1.3.1

1.3.2. Создайте переменную $a и присвойте ей стартовое значение 0. Создайте переменную $b и присвойте ей выражение, состоящее из префиксного оператора инкремента и переменной $a. Выведите новое значение переменной $b и значение переменной $a на экран. Верните переменной стартовое значение, после чего проделайте тоже самое, но использовав постфиксный оператор инкремента. Объясните полученный результат. Для закрепления проделайте все тоже самое, но уже с префиксным и постфиксным операторами декремента. Показать решение.

<?php 
$a=0;			//Присвоили стартовое значение
$b=++$a;		//Увеличили значение $a на единицу, затем присвоили его $b
echo $b.'<br>'; //Выведет 1
echo $a.'<br>'; //Выведет 1

$a=0; 			//Возвращаем стартовое значение
$b=$a++;		//Присвоили $b значение $a, затем увеличили значение $a на единицу
echo $b.'<br>'; //Выведет 0
echo $a.'<br>'; //Выведет 1

$a=0; 			//Возвращаем стартовое значение
$b=--$a;		//Уменьшили значение $a на единицу, затем присвоили его $b
echo $b.'<br>'; //Выведет -1
echo $a.'<br>'; //Выведет -1

$a=0; 			//Возвращаем стартовое значение
$b=$a--;		//Присвоили $b значение $a, затем уменьшили значение $a на единицу
echo $b.'<br>'; //Выведет 0
echo $a.'<br>'; //Выведет -1
?>

Решение задачи №1.3.2

1.3.3. Создайте переменную $a и присвойте ей стартовое значение 0. Увеличьте значение переменной на 10, использовав комбинированный оператор присваивания. Выведите новое значение на экран. Далее, используя соответствующие комбинированные операторы и выводя промежуточные результаты на экран, увеличьте значение переменной в два раза, уменьшите на 5, разделите на 3, возведите в квадрат и в конце найдите остаток от деления на 7. Показать решение.

<?php 
$a=0;   //Присвоили начальное значение
 
$a+=10; //Теперь $a==10, что равнозначно $a=$a+10; 
echo $a.'<br>';
 
$a*=2;  //Теперь $a==20, что равнозначно $a=$a*2;
echo $a.'<br>';
 
$a-=5;  //Теперь $a==15, что равнозначно $a=$a-5;
echo $a.'<br>';
 
$a/=3;  //Теперь $a==5, что равнозначно $a=$a/3;
echo $a.'<br>';
 
$a**=2; //Теперь $a==25, что равнозначно $a=$a**2;
echo $a.'<br>';
 
$a%=7;  //Теперь $a==4, что равнозначно $a=$a%7;
echo $a.'<br>';
?>

Решение задачи №1.3.3

1.3.4. Создайте переменную $a и присвойте ей строку 'Ну, ты и '. Измените значение переменной, присоединив к строке еще одну строку 'фрукт!'. Используйте для этого комбинированный оператор присваивания с конкатенацией. Выведите новое значение на экран. Показать решение.

<?php 
$a='Ну, ты и ';   //Присвоили начальную строку
 
$a.='фрукт!'; 	  //Что равнозначно $a=$a.'фрукт!'; 
echo $a.'<br>';
 
/* Не забываем, что в PHP строки конкатенируются  
	при помощи оператора 'точка' */
?>

Решение задачи №1.3.4

1.3.5. Каковы будут результаты сравнения в условии задачи? Проверьте свои ответы посредством вывода результатов на экран. Не забывайте, что результатом сравнения выражений является одно из логических значений true или false. Соответственно, при выводе оператор echo преобразует их либо в строку '1', либо в пустую строку ''. Показать решение.

<?php 
$a=15;     		
$b=20;     		
$a>$b; 	

$a='15';     
$b='20';     
$a>$b;  
 
$a=null;
$a>$b; 
				
$a=='0';    
$a<true;    
$a=='';     
 
'tree'>'Body';  
  
$a==[];     
[]>'';      
[85,100,8=>50]<[1,2,3,4]; 
?>

Условие задачи №1.3.5

<?php 
$a=15;     	//Присвоили число 15
$b=20;     	//Присвоили число 20
$a>$b;      //false 

$a='15';    //Присвоили строку '15'
$b='20';    //Присвоили строку '20'
$a>$b;      //false, т.к. данные строки преобразуются в числа 
 
$a=null;
$a>$b;      //false, т.к. null преобразуется в false, а строка '20' в true
				
$a=='0';    //false, т.к. принимается, что null<'0'
$a<true;    //true, т.к. null преобразуется в false, а false<true
$a=='';     //true, т.к. оба операнда преобразуются в false
 
'tree'>'Body';  //true, т.к. символ нижнего регистра больше любого символа 
            //верхнего регистра, т.е. 't'>'B', а значит и 'tree'>'Body'
           
$a==[];     //true, т.к. один из операндов null, то оба преобразовались в тип bool,
            //и пустой массив в ходе преобразования стал значением false
				
[]>'';      //true, т.к. массив больше любого значения, если оно не является 
            //объектом или не нужно сравнивать со значением типа null или bool
				
[85,100,8=>50]<[1,2,3,4]; //true, т.к. во втором массиве больше элементов
 
/* Для сравнения различных значений существует ряд соответствующих функций, 
которыми и нужно пользоваться */
?>

Решение задачи №1.3.5

1.3.6. Какие значения будут присвоены переменной $a в условии задачи? Проверьте свои ответы посредством вывода на экран. Не забывайте, что результатом логических выражений является одно из логических значений true или false. Соответственно, при выводе оператор echo преобразует их либо в строку '1', либо в пустую строку ''. Показать решение.

<?php 
$a=10||true; 
				 
$a=1||false; 
$a=0||false; 
 
$a=10&&'20';          
$a='0'&&'apple';            
 
$a=!false;             
$a=!10;      
$a=!'one';   
 
$a=10||0;          
$a=10 or 0;        

$a=10&&0;         
$a=10 and 0;       
 
$a=10 xor 0;      
$a=(10 xor 20);    
?>

Условие задачи №1.3.6

<?php 
$a=10||true; //Теперь $a==true, т.к. операнды преобразуются к логическому типу,
             //поэтому 10 преобразовалось в true
				 
$a=1||false; //Теперь $a==true, т.к. 1->true
$a=0||false; //Теперь $a==false, т.к. 0->false
 
$a=10&&'20'; //Теперь $a==true, т.к. 10->true и '20'->true (не пустая строка)         
$a='0'&&'apple';   //Теперь $a==false, т.к. '0'->false          
 
$a=!false;   //Теперь $a==true            
$a=!10;      //Теперь $a==false, т.к. 10->true
$a=!'one';   //Теперь $a==false, т.к. 'one'->true
 
$a=10||0;          //Теперь $a==true, действует как ($a=(10||0))
$a=10 or 0;        //Теперь $a==10, действует как (($a=10) or 0)

$a=10&&0;          //Теперь $a==false, действует как ($a=(10&&0))
$a=10 and 0;       //Теперь $a==10, действует как (($a=10) and 0)
 
$a=10 xor 0;       //Теперь $a==10, действует как (($a=10) xor 0)
$a=(10 xor 20);    //Теперь $a==false, действует как ($a=(10 xor 20))
?>

Решение задачи №1.3.6

§1.4. Управляющие конструкции

1.4.1. Создайте переменные $a, $b и присвойте им положительные числа. Присвойте частное от деления $a/$b третьей переменной $d. Используя условный оператор if, осуществите схему вывода на экран значения переменной $d только в том случае, если оно является положительным числом. Проверьте работу скрипта, после чего измените одно из значений переменных на отрицательное число и снова запустите скрипт. Показать решение.

<?php 
$a=10; 		//Присвоили первой переменной положительное число
$b=5;  		//Присвоили второй переменной положительное число         
$d=$a/$b;   //Присвоили частное третьей переменной

if($d>0){   //Проверяем условие
  echo $d;  //Выводим только, если условие истинно
}				 
?>

Решение задачи №1.4.1

1.4.2. Создайте переменные $a, $b и присвойте им положительные числа. Присвойте частное от деления $a/$b третьей переменной $d. Используя условный оператор if, осуществите схему вывода на экран значения переменной $d только в том случае, если оно является положительным числом. Если число окажется отрицательным или равным нулю, должно выводиться соответствующее предупреждение, а не значение переменной. Проверьте работу скрипта, после чего измените одно из значений переменных $a или $b на отрицательное число и снова запустите скрипт. Показать решение.

<?php 
$a=10; 		//Присвоили первой переменной положительное число
$b=5;  		//Присвоили второй переменной положительное число         
$d=$a/$b;   //Присвоили частное третьей переменной

if($d>0){   //Проверяем условие
   echo $d; //Выводим только, если условие истинно,
}else{		//иначе выводим предупреждение
	echo 'Частное меньше или равно нулю!';
}				 
?>

Решение задачи №1.4.2

1.4.3. Создайте переменные $a, $b и присвойте им положительные числа. Присвойте частное от деления $a/$b третьей переменной $d. Используя условный оператор if в связке с else if, осуществите схему вывода на экран значения переменной $d только в том случае, если оно является положительным числом. Если число окажется отрицательным или равным нулю, то для каждого случая должно выводиться соответствующее предупреждение. Проверьте работу скрипта, после чего измените одно из значений переменных $a или $b на отрицательное число и запустите скрипт снова. Чтобы проверить работу скрипта для нулевого значения, измените значение переменной $a на ноль. Показать решение.

<?php 
$a=10; 		//Присвоили первой переменной положительное число
$b=5;  		//Присвоили второй переменной положительное число         
$d=$a/$b;   //Присвоили частное третьей переменной

if($d>0){   //Проверяем условие
   echo $d; //Выводим только, если $d>0
}else if($d==0){	   			 //Проверяем условие
	echo 'Частное равно нулю!';  //Выводим только, если $d==0
}else{ 		//иначе
	echo 'Частное имеет отрицательное значение!'; //Выводим только, если $d<0
}				 
?>

Решение задачи №1.4.3

1.4.4. Реализуйте условие задачи 4.3 при помощи оператора switch. Показать решение.

<?php 
$a=10; 		//Присвоили первой переменной положительное число
$b=5;  		//Присвоили второй переменной положительное число         
$d=$a/$b;   //Присвоили частное третьей переменной

switch(true){   //Вход будет осуществляться всегда
  case $d>0: 
	 echo $d;
  break;		//Прерываем, чтобы не выполнялись другие блоки case
  
  case $d==0:	   			 
	 echo 'Частное равно нулю!'; 
  break;
  
  case $d<0:	  //Можно заменить на default, т.к. вариантов больше нет	   			
	 echo 'Частное имеет отрицательное значение!'; 
  break;
}				 
?>

Решение задачи №1.4.4

1.4.5. Создайте переменную и присвойте ей массив, состоящий из пяти элементов, например, чисел или строк. Создайте еще одну переменную, которой присвойте какое-нибудь значение. Теперь создайте конструкцию switch, которая будет определять, есть такой элемент в массиве или нет и выводить соответствующее сообщение. Для упрощения кода используйте операторы case, идущие друг за другом и содержащие метки в виде значений элементов массива, но не прерывающиеся операторами break. Не забудьте про условие по умолчанию, которое будет выводить сообщение, если элемента в массиве нет. Протестируйте конструкцию, присваивая второй переменной различные значения. Показать решение.

<?php 
$a=[0,2,4,8,16]; 		
$b=1;

switch($b){   
  case 0: //Т.к. оператор break отстствует, то интерпретатор 
  case 2: //будет выполнять все инструкции подряд, пока не 
  case 4: //дойдет до конца конструкции или не встретит break
  case 8:
  case 16:
	echo 'Элемент в массиве присутствует';
  break;  //Прерываем, чтобы не выполнялось условие по умолчанию
    
  default: 
	 echo 'Элемент в массиве отсутствует';
}				 
?>

Решение задачи №1.4.5

1.4.6. Создайте переменную $a и присвойте ей ноль в качестве стартового значения. Выведите на экран при помощи цикла while цифры от 1 до 5, использовав для этого операцию префиксного инкремента переменной $a. Сбросьте значение переменной и сделайте тоже самое, но при помощи цикла do/while. Показать решение.

<?php 
$a=0; 		

while($a<5){       
   echo $a=++$a; //Код выполняется пока $a<5
} 

$a=0;
echo '<br>';

do{
  echo $a=++$a; //Код выполняется пока $a<5
}while($a<5);
?>

Решение задачи №1.4.6

1.4.7. Создайте переменную $a и присвойте ей массив, состоящий из пяти элементов. Выведите все элементы массива на экран сперва при помощи цикла while, а затем и do/while. Показать решение.

<?php 
$a=[3,6,'one',10,20];  //Создаем массив с 5 элементами	

$i=0;		 //Устанавливаем стартовое значение счетчика

while($i<5){       
   echo $a[$i].'<br>'; //Код выполняется пока $i<5
	$i++;  //Увеличиваем значение счетчика на единицу
} 

$i=0;	 	 //Сбрасываем значение счетчика
echo '<br>'; //Сделаем дополнительный разрыв строк

do{
	echo $a[$i].'<br>'; //Код выполняется пока $i<5
	$i++;  //Увеличиваем значение счетчика на единицу
}while($i<5);
?>

Решение задачи №1.4.7

1.4.8. Выведите все элементы массива из предыдущей задачи на экран при помощи цикла for. Обратите внимание на компактность кода. Показать решение.

<?php 
$a=[3,6,'one',10,20];  //Создаем массив с 5 элементами	

for($i=0;$i<5;$i++){       
   echo $a[$i].'<br>'; //Код выполняется пока $i<5
} 
?>

Решение задачи №1.4.8

1.4.9. Используйте цикл for для вывода на экран целых положительных чисел не превышающих 50. Прервите цикл на 10 итерации при помощи внутреннего условного оператора if и оператора break. Показать решение.

<?php 
for($i=1;$i<=50;$i++){       
   
	echo $i.'<br>'; //Выводим текущее значение счетчика
	
	if($i==10){     //Если $i==10
		break;		 //Прерываем цикл
	}
} 
?>

Решение задачи №1.4.9

1.4.10. Выведите на экран таблицу умножения. Используйте внешний и внутренний циклы for. Чтобы таблица имела привычный для нас 'квадратный' вид, в конце каждой итерации внешнего цикла задайте вывод разрыва строки. Показать решение.

<?php 
for($i=1;$i<=9;$i++){  		//Задаем внешний цикл    
   
	for($k=1;$k<=9;$k++){    //Задаем внутренний цикл 
		
		if($i*$k<10){ //Добавим пробелы для выравнивания столбцов таблицы
			echo $i*$k.' &nbsp; &nbsp; '; //Для результатов с одной цифрой
		}else{
			echo $i*$k.' &nbsp; ';        //Для результатов с 2 цифрами
		}
	}
	
	echo '<br><br>';  //Добавляем разрывы строк, чтобы таблица шла рядами
} 
?>

Решение задачи №1.4.10

1.4.11. Создайте массив, состоящий из пяти элементов. Выведите на экран значения элементов массива, использовав для этого цикл foreach в двух вариантах: с выводом только значений и с выводом как ключей, так и значений соответствующих элементов. Показать решение.

<?php
$arr=['a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5]; //Создали массив с 5 элементами
 
foreach($arr as $value){         //Первый вариант цикла
   echo $value.' ';              //Выведет в ходе цикла все значения элементов массива
}  
 
echo '<br>';
 
foreach($arr as $key=>$value){   //Второй вариант цикла
   echo $key.'=>'.$value.'<br>'; //Выведет в ходе цикла все пары 
                                 //'ключ=>значение' элементов массива
}
?>

Решение задачи №1.4.11

1.4.12. Создайте массив, состоящий из пяти элементов в виде целых чисел. Увеличьте значения всех элементов массива в два раза, использовав для этого цикл foreach. Выведите на экран новые значения элементов массива. Показать решение.

<?php
$arr=['a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5]; //Создали массив с 5 элементами
 
foreach($arr as $key=>$value){   
  $value*=2;					//Увеличиваем каждое значение в два раза 
  echo $key.'=>'.$value.'<br>'; //Выведет в ходе цикла все пары 
                                //'ключ=>значение' элементов массива
}
?>

Решение задачи №1.4.12

1.4.13. Выведите на экран при помощи цикла for положительные целые числа от 1 до 10. Затем используйте оператор continue, чтобы исключить из ряда числа 3,4,5. Попробуйте разместить оператор continue до и после инструкции вывода значений на экран и объясните результат. Показать решение.

<?php
for($i=0;$i<=10;$i++){   
  
  if($i>=3&&$i<=5){  //Прерываем текущую итерацию цикла,
	continue;  		 //если 3<=$i<=5
  }
  
  echo $i.'<br>';	   //Выводим текущее значение счетчика
}

/* Если разместить оператор continue после echo, числа все равно будут 
выведены, т.к. до момента прерывания инструкция уже будет выполнена */
?>

Решение задачи №1.4.13

1.4.14. Используйте условие задачи 4.10, но исключите из таблицы столбик умножения на 5. Для этого прервите внутренний цикл оператором continue при $k==5. Показать решение.

<?php
for($i=1;$i<=9;$i++){     //Задаем внешний цикл    
    
    for($k=1;$k<=9;$k++){ //Задаем внутренний цикл 
         
        if($k==5){        //Если $k==5,    
			  continue;	  //прерываем внутренний цикл
		  }
		  
		  if($i*$k<10){   //Добавим пробелы для выравнивания столбцов таблицы
            echo $i*$k.' &nbsp; &nbsp; '; //Для результатов с одной цифрой
        }else{
            echo $i*$k.' &nbsp; ';        //Для результатов с 2 цифрами
        }
    }
     
    echo '<br><br>';      //Добавляем разрывы строк, чтобы таблица шла рядами
} 
?>

Решение задачи №1.4.14

1.4.15. Задайте бесконечный цикл for, который будет выводить квадраты целых положительных чисел. Цикл будет бесконечным, если второй параметр в условии будет отсутствовать. Если квадрат числа превысит 70, прервите цикл при помощи оператора goto, который будет осуществлять переход к метке после цикла для вывода соответствующего сообщения. Показать решение.

<?php
for($i=1;;$i++){      //Задаем бесконечный цикл    
               
  if($i*$i>70){     	 //Если квадрат числа превышает 70    
	  goto message_1; //прерываем цикл и переходим к метке
  }
	   
  echo $i*$i.'<br>';  //Выводим квадраты чисел на экран
} 

message_1:
echo 'Вывод квадратов чисел, которые меньше 70, окончен!';
?>

Решение задачи №1.4.15

§1.5. Функции

1.5.1. Создайте пользовательскую функцию, которая принимает два аргумента, а возвращает их произведение. Вызовите функцию, передав ей в качестве аргументов два числа и выведите на экран результат. Показать решение.

<?php
function mult_func($arg_1, $arg_2) {  //Объявили функцию с 2 аргументами 
   $product = $arg_1*$arg_2; 
   return  $product;     //Значение возвращаемое функцией при ее вызове 
} 
echo mult_func(5,10); 	 //Вызываем функцию и выводим ее значение, т.е. 50
?>

Решение задачи №1.5.1

1.5.2. Создайте три переменные и присвойте им числовые значения. Выведите на экран их произведение. Теперь создайте пользовательскую функцию, принимающую два аргумента по ссылке и один аргумент по значению. Функция должна присваивать переменным другие числовые значения. Вызовите функцию, после чего снова выведите на экран произведение всех переменных. Объясните результат. Показать решение.

<?php
$n_1=1; //Присвоили первой переменной значение
$n_2=2; //Присвоили второй переменной значение
$n_3=3; //Присвоили третьей переменной значение
echo $n_1*$n_2*$n_3, '<br>'; //Выведет 6
 
function my_func(&$arg_1,&$arg_2,$arg_3 ){ //2 аргумента передаются по ссылке, 
										   //а третий по значению 
   $arg_1=5; 
   $arg_2=10;
	$arg_3=20;
}
 
my_func($n_1,$n_2,$n_3); //Вызываем функцию
echo $n_1*$n_2*$n_3; 	 //Выведет 150

/* Т.к. 2 переменные переданы по ссылке, то изменив их значения внутри функции, 
мы изменили и сами переменные. Третья переменная была передана по значению, 
поэтому при манипуляциях внутри функции, само значение вне функции осталось 
прежним. */
?>

Решение задачи №1.5.2

1.5.3. Создайте две переменные и присвойте им числовые значения. Теперь создайте пользовательскую функцию, принимающую два аргумента со значеними по умолчанию и выводящую произведение своих аргументов. Вызовите функцию, передав ей сперва в качестве аргументов значения переменных, затем значение только одной из переменных и, наконец, вообще без аргументов. Объясните полученные результаты. Показать решение.

<?php
$n_1=1; //Присвоили первой переменной значение
$n_2=2; //Присвоили второй переменной значение
 
function my_func($arg_1=5,$arg_2=10 ){//Аргументы имеют значения по умолчанию 
														
  echo $arg_1*$arg_2.'<br>';		    //Выводим произведение аргументов функции
}
 
my_func($n_1,$n_2); //Вызываем функцию, передав ей два аргумента
my_func($n_1); 	    //Вызываем функцию, передав ей одни аргумент
my_func(); 		    //Вызываем функцию без передачи ей аргументов
?>

Решение задачи №1.5.3

1.5.4. Создайте пользовательскую функцию, принимающую аргументы в массив переменной длины и выводящую их затем на экран. Используйте для доступа к элементам массива цикл foreach. Вызовите функцию, передав ей в качестве значения две строки и число. Показать решение.

<?php
function my_func(...$argums){    //Использовали массив переменной длины 
	
	foreach($argums as $value){  //Выводим все значения на экран
      echo $value.'<br>'; 
   }													
}
 
my_func('one', 'two', 3); 	 	 //Передаем функции три аргумента
?>

Решение задачи №1.5.4

1.5.5. Создайте две переменные $sum и $product и присвойте им стартовые значения, равные 0 и 1. Создайте пользовательскую функцию, принимающую два аргумента по ссылке, а все остальные по значению в массив переменной длины. Функция должна вычислять сумму всех аргументов, переданных в массив переменной длины, и присваивать ее первому аргументу. Второму аргументу она должна присваивать произведение всех аргументов, переданных в массив переменной длины. Возвращать функция должна массив, состоящий из первых двух аргументов, переданных функции (т.е. сумму и произведение). Используйте для доступа к элементам массива цикл foreach. Вызовите функцию, передав ей в качестве первых двух аргументов наши переменные, а также три числа. Выведите на экран значения возвращенного массива, а также значения наших переменных. Объясните результат. Показать решение.

<?php
$sum=0;
$product=1;

function my_func(&$arg_1, &$arg_2, ...$args){ 
	
	foreach($args as $value){  
      $arg_1+=$value; 
		$arg_2*=$value;
   }
	return [$arg_1,$arg_2];	
}

$b=my_func($sum,$product,5,10,15);   	//Для удобства присвоили вызов переменной
echo $b[0].'<br>'.$b[1].'<br>'.'<br>';  //Выводим значения массива
 
echo $sum.'<br>'.$product; 			  //Выводим значения переменных

/* Аргументы были переданы функции по ссылке, поэтому значения 
	наших переменных были изменены. */
?>

Решение задачи №1.5.5

1.5.6. Создайте пользовательскую функцию, которая будет выводить на экран сумму первых двух переданных ей аргументов. Количество передаваемых функции аргументов не указывайте. Если функция будет получать более двух аргументов, она должна выдавать соответствующее предупреждение и не выводить сумму. Вызовите функцию, передав ей в качестве аргументов массив из двух чисел и развернув его в простые аргументы при помощи '...'. Повторите тоже самое для массива из трех чисел. Напомним, что количество переданных функции элементов можно узнать при помощи функции func_num_args(), а получить доступ к ним можно при помощи функции func_get_arg(n). Показать решение.

<?php
function my_func(){ 
	
	if(func_num_args()==2){ //Проверяем количество переданных аргументов
		$sum=func_get_arg(0)*func_get_arg(1); //Вычисляем сумму и 
		echo 'Сумма чисел равна '.$sum.'<br>';//выводим ее значение на экран
	}else{
		echo 'Уменьшите количество аргументов до двух!';
	}
}

my_func(...[5,10]);    //Разворачиваем массив в элементы при вызове функции
my_func(...[5,10,15]); //Выведет предупреждение
?>

Решение задачи №1.5.6

1.5.7. Задайте режим строгой типизации (используйте инструкцию declare(strict_types=1);), после чего создайте пользовательскую функцию, которая будет принимать два целочисленных аргумента и выводить на экран их сумму. Вызовите функцию, передав ей в качестве аргументов сперва два целых числа, а потом одно из них в виде строки. Закомментируйте строку с инструкцией строгой типизации и перезапустите скрипт. Объясните результат. Показать решение.

<?php
declare(strict_types=1);   //Задаем режим строгой типизации для скрипта

function my_func(int $a,int $b){  //Функция ожидает два целых числа 
  echo $a+$b; 
} 

echo my_func(10,10);       //Выведет 7
echo my_func('10',10);     //Выведет ошибку, т.к. включен режим строгой типизации

/* Если режим строгой типизации будет отключен, то в обоих случаях будет выведено 
число 7, т.к. интерпретатор осуществит преобразование типов, в результате 
которого строка будет преобразована обратно в число. 
 Аналогично можно задавать и тип возвращаемого функцией значения. */
?>

Решение задачи №1.5.7

1.5.8. Задайте режим строгой типизации (используйте инструкцию declare(strict_types=1);), после чего создайте пользовательскую функцию my_func(), которая будет принимать два целочисленных аргумента и возвращать их произведение. Создайте переменную $count_apples и присвойте ей строку с именем функции. Обратитесь к функции через переменную и выведите на экран общую массу яблок зная, что имеется 23 корзины по 7 кг яблок в каждой. Показать решение.

<?php
declare(strict_types=1);  		  //Задаем режим строгой типизации для скрипта

function my_func(int $a,int $b){  //Функция ожидает два целых числа 
  return $a*$b; 
} 

$count_apples='my_func';
echo $count_apples(23,7).' кг';   //Выведет 161 кг
?>

Решение задачи №1.5.8

1.5.9. Создайте переменную и присвойте ей целое число. Создайте еще одну переменную и присвойте ей анонимную функцию, наследующую эту переменную и выводящую на экран ее инкрементированное значение. Осуществите вызов функции, затем измените значение внешней переменной и опять вызовите функцию. Объясните результат. Измените скрипт, задав наследование переменной по ссылке. Объясните изменения результата, если они будут. Показать решение.

<?php
$number=0;    	 //Создаем переменную в родительской области видимости
 
$my_func_1 = function() use ($number){  //Наследуем внешнюю переменную
   echo ++$number.'<br>'; 			  //Увеличиваем значение на 1
};    
$my_func_1();   //Выведет 1

$number=5;      //Изменяем переменную в родительской области видимости
$my_func_1();   //Выведет 1, а не 6, т.к. значение унаследованной переменной 
                //задается там, где функция определена, а не там, где вызвана!
  
/* Если бы мы унаследовали внешнюю переменную по ссылке, 
	то скрипт вывел бы 1, а затем 6    */                 
?>

Решение задачи №1.5.9

§1.6. Классы и объекты

1.6.1. Создайте класс, в котором задайте константу, общедоступные свойство и метод класса. Метод класса должен выводить какое-нибудь сообщение. Создайте экземпляр класса. Вызовите метод класса, а также выведите на экран сумму значений константы класса и его свойства. Не забудьте, что для доступа к константе класса нужно использовать двойное двоеточие '::', а не объектный оператор '->'. Показать решение.

<?php
class my_class{          //Объявили класс 
  const my_const=10;     //Создаем числовую константу
  public $my_var=15;     //Объявили и сразу инициализировали свойство класса
  
  function my_method(){	 //Метод класса  
   echo 'Я создал свой класс!'.'<br>';		 //Выводим строку на экран 
  } 
 }
  
$my_object=new my_class();  	 //Создали экземпляр класса, т.е. объект
$my_object->my_method();  	    //Выведет 'Я создал свой класс!'
                
$sum=$my_object->my_var+$my_object::my_const;  //Присваиваем сумму переменной
echo $sum; 						 //Выведет 25  
?>

Решение задачи №1.6.1

1.6.2. Имеется 7 корзин. Нужно разработать класс, который будет подсчитывать общую массу яблок в зависимости от вместимости корзин. Для этого создайте сам класс. Затем создайте константу класса, которой присвойте количество корзин. Объявите свойство класса, но не инициализируйте его. Свойство будет отвечать за вместимость корзины в килограммах. И, наконец, объявите метод, который будет принимать в качестве аргумента вместимость корзины, т.е. значение соответствующего свойства, а возвращать произведение количества корзин (значение нашей константы) на вместимость одной корзины. После оформления класса, создайте его экземпляр и выведите на экран количество корзин. Не забудьте, что для доступа к константе класса нужно использовать двойное двоеточие '::', а не объектный оператор '->'. Затем присвойте свойству класса положительное число и выведите на экран общую массу яблок, которую могут вместить все корзины, использовав для этого оператор echo и вызов метода класса. Показать решение.

<?php
class my_class{          //Объявили класс 
  const baskets=7;       //Создаем числовую константу
  public $mass;          //Объявили, но неинициализировали свойство класса
  
  function product_mass(){  //Метод класса выводит сумму константы и свойства класса 
   return $this::baskets*$this->mass;  //Ключевое слово $this ссылается на сам объект 
  } 
}
  
$apples=new my_class();  //Создали экземпляр класса, т.е. объект
echo 'Количество корзин '.$apples::baskets.'<br>';  	   //Выведет 7  
               
$apples->mass=10;     //Пусть в корзину влазит 10кг яблок
echo 'Всего вместится '.$apples->product_mass().'кг яблок'; //70кг  
?>

Решение задачи №1.6.2

1.6.3. Используйте условие задачи 6.1, но объявите свойство класса статическим. Не забудьте сразу же изменить и последующий код скрипта! Показать решение.

<?php
class my_class{          //Объявили класс 
  const my_const=10;     //Создаем числовую константу
  static public $my_var=15;    //Объявили и сразу инициализировали свойство класса
  
  function my_method(){			 //Метод класса  
   echo 'Я создал свой класс!'.'<br>';		 //Выводим строку на экран 
  } 
 }
  
$my_object=new my_class();  	 //Создали экземпляр класса, т.е. объект
$my_object->my_method();  	    //Выведет 'Я создал свой класс!'
                
$sum=$my_object::$my_var+$my_object::my_const;  //Присваиваем сумму переменной
echo $sum; 						 //Выведет 25  
?>

Решение задачи №1.6.3

1.6.4. Используя условие задачи 6.2, создайте класс-потомок. В нем объявите общедоступное свойство $price и создайте метод product_price(), который аналогичным образом будет вычислять общую стоимость всех яблок. После чего выведите общее количество корзин, массу и стоимость всех яблок на экран. Показать решение.

<?php
class my_class{          //Объявили класс 
  const baskets=7;       //Создаем числовую константу
  public $mass;          //Объявили, но неинициализировали свойство класса
  
  function product_mass(){ 
   return $this::baskets*$this->mass; //$this ссылается на сам объект 
  } 
}
 
class my_class_2 extends my_class{
  public $price;         //Объявили, но неинициализировали свойство класса	
  
  function product_price(){ 
   return $this::baskets*$this->price; //$this ссылается на сам объект 
  } 	
}
  
$apples=new my_class_2();  //Создали экземпляр класса, т.е. объект
echo 'Количество корзин '.$apples::baskets.'<br>';  		 //Выведет 7 
                
$apples->mass=10;       //Пусть в корзину влазит 10кг яблок
echo 'Всего вместится '.$apples->product_mass().'кг яблок'.'<br>'; 

$apples->price=1.5;     //Пусть 1кг яблок стоит 1.5. у.е.
echo 'Стоимость составит '.$apples->product_price().' у.е.'; 
?>

Решение задачи №1.6.4

1.6.5. Используя условие задачи 6.4, создайте класс-потомок уже созданного класса-потомка. В нем объявите константу sale, которая будет отвечать за размер скидки, и создайте метод product_sale(), который будет определять величину скидки в зависимости от общей массы приобретенных яблок. При определении метода используйте конструкцию parent:: для доступа к методу product_price() и конструкцию self:: для доступа к константе sale. Метод должен давать скидку, если масса купленных яблок превысит 50 кг. После оформления класса-потомка, создайте объект класса, установите массу яблок, которые помещаются в одну корзину, в 12 кг, а стоимость одного килограмма в 1.6 у.е. Далее выведите на экран общее количество корзин, общую массу яблок в корзинах, а также стоимость всех яблок без скидки и со скидкой. Показать решение.

<?php
class my_class{          //Объявили класс 
  const baskets=7;       //Создаем числовую константу
  public $mass;          //Объявили, но неинициализировали свойство класса
  
  function product_mass(){ 
   return $this::baskets*$this->mass; //$this ссылается на сам объект 
  } 
}
 
class my_class_2 extends my_class{
  public $price;         //Объявили, но неинициализировали свойство класса	
  
  function product_price(){ 
   return $this::baskets*$this->price; //$this ссылается на сам объект 
  } 	
}

class my_class_3 extends my_class_2{
 const sale=0.8; //Скидка в 20%  
  
  function product_sale(){ 
	$start_price=parent::product_price();  //вычисляем общую стоимость
	
	if($this->product_mass()>50){   //Если общая масса яблок больше 50кг, 
		return $start_price*self::sale;    //возвращаем цену со скидкой в 20%.
	}else{							//Иначе
		return $start_price;		//без скидки
	}
  } 	
}
  
$apples=new my_class_3();  //Создали экземпляр класса, т.е. объект
echo 'Количество корзин '.$apples::baskets.'<br>';  		 //Выведет 7 
                
$apples->mass=12;          //Пусть в корзину влазит 12кг яблок
echo 'Всего вместится '.$apples->product_mass().'кг яблок'.'<br>'; 

$apples->price=1.6;        //Пусть 1кг яблок стоит 1.6. у.е.
echo 'Стоимость без скидки составит '.$apples->product_price().' у.е.'.'<br>'; 
echo 'Стоимость со скидкой составит '.$apples->product_sale().' у.е.';

	/* Отметим, что в данном примере вместо parent и self 
			можно было использовать и $this */
?>

Решение задачи №1.6.5

1.6.6. Внимательно изучите условие задачи и закомментируйте неверные инструкции. Показать решение.

<?php
class parent_class{
   protected $p_1='Защищенное свойство ';   
   private $p_2='Закрытое свойство ';     
    
   public function parent_func(){
      echo $this->p_2.'<br>';   
      echo $this->p_1.'<br>';  
   }
}
 
class descendant_class extends parent_class{
   private $p_1='p_var ';   
	private $p_2='p_var ';     
                             									
   function child_func(){     
      echo $this->p_1.'<br>';   
       echo $this->p_2.'<br>';  
  }
}
 
$obj=new parent_class();         
$obj_2=new descendant_class();   
 
$obj->parent_func();  
echo $obj->p_2;  	 
echo $obj_2->p_2; 	 
$obj_2->child_func(); 
echo $obj->p_1;  	 
?>

Условие задачи №1.6.6

<?php
class parent_class{
   protected $p_1='Защищенное свойство '; //Доступно изнутри самого класса  
                                          //и всех классов-потомков
   private $p_2='Закрытое свойство ';     //Доступно только изнутри класса
    
   public function parent_func(){
      echo $this->p_2.'<br>';  //Оба свойства доступны, т.к. запрашиваются 
      echo $this->p_1.'<br>';  //изнутри класса, где были определены
   }
}
 
class descendant_class extends parent_class{
   //private $p_1='p_var ';    //Вызовет ошибку, т.к. свойство должно 
							   //оставаться protected или стать public
													
	private $p_2='p_var ';     //Переопределяем свойство для класса-потомка
                             									
   function child_func(){      //Определяем метод класса-потомка
      echo $this->p_1.'<br>';  //Это свойство доступно, т.к. оно protected и  
                               //запрашивается изнутри класса-потомка
      echo $this->p_2.'<br>';  //Выведет переопределенное свойство класса-потомка 
  }
}
 
$obj=new parent_class();       //Создаем экземпляр родительского класса 
$obj_2=new descendant_class(); //Создаем экземпляр класса-потомка
 
$obj->parent_func();  //Сработает без ошибок 
//echo $obj->p_2;  	 //Выдаст ошибку, т.к. свойство вне класса недоступно
//echo $obj_2->p_2; 	 //Выдаст ошибку, т.к. свойство неопределено в descendant_class
$obj_2->child_func(); //Сработает без ошибок
//echo $obj->p_1;  	 //Выдаст ошибку, т.к. свойство вне классов недоступно 
?>

Решение задачи №1.6.6

1.6.7. Создайте абстрактный класс, который будет содержать два абстрактных защищенных метода return_car_name() и return_car_price(), а также один обычный общедоступный метод return_year($year), принимающий год выпуска автомобиля, а возвращающий строку "Год выпуска авто: {$year}". После оформления абстрактного класса, создайте два класса-потомка bmw_car и ford_car. Абстрактный метод return_car_name() после реализации должен возвращать строку с маркой автомобиля, а return_car_price(), соответственно, его цену в виде числа. Создайте экземпляр первого класса и вызовите его методы, а затем повторите тоже самое со вторым классом. Показать решение.

<?php
abstract class abstract_class{                     //Объявили абстрактный класс
   abstract protected function return_car_name();  //Будет возвращать марку авто
   abstract protected function return_car_price(); //Будет возвращать цену авто
    
   public function return_year($year){    	 	   //Обычный общий метод 
      return "Год выпуска авто: {$year}";
   }
}
 
 
class bmw_car extends abstract_class{
   
	public function return_car_name(){ //Реализуем (заполняем) метод
      return 'BMW';
   }
    
   public function return_car_price(){ //Расширяем область видимости метода
      return 30000;
   }
}
 
 
class ford_car extends abstract_class{
   
	public function return_car_name() { //Реализуем (заполняем) метод
      return 'Ford';
   }
    
   public function return_car_price(){  //Расширяем область видимости метода
      return 20000;
   }
}
 
$bmw = new bmw_car;            //Создаем экземпляр первого класса-потомка
echo $bmw->return_car_name().'<br>';
echo $bmw->return_year(2003).'<br>';
echo $bmw->return_car_price().'<br><br>';
 
$ford = new ford_car;          //Создаем экземпляр второго класса-потомка
echo $ford->return_car_name().'<br>';
echo $ford->return_year(2005).'<br>';
echo $ford->return_car_price().'<br>';
?>

Решение задачи №1.6.7

1.6.8. Объявите два интерфейса, а в каждом из них по дному общедоступному методу. Реализуйте оба интерфейса в классе. Методы после реализации должны принимать по одному аргументу, а затем просто возвращать их. Создайте объект класса и выведите на экран остаток от деления результата вызова первого метода на результат вызова второго метода. Методам в качестве аргументов передайте целые числа. Не забывайте, что при реализации интерфейсов в классе используется служебное слово implements, а служебное слово extends используется при наследовании интерфейсов друг от друга. При этом разрешается наследовать сразу несколько интерфейсов, разделяя их запятыми. Показать решение.

<?php
interface my_intf_1{                  //Объявляем первый интерфейс
   public function my_func_1($a);     //Метод должен принимать 1 аргумент
}
 
interface my_intf_2{                  //Объявляем второй интерфейс
   public function my_func_2($b);     //Метод должен принимать 1 аргумент
}
 
 
class my_class implements my_intf_1, my_intf_2{ //Реализуем интерфейсы в классе
                     
   public function my_func_1($a){               //Реализуем первый метод
            return $a;    
          }
            
   public function my_func_2($b){               //Реализуем второй метод
            return $b;
          }
}
 
$obj= new my_class();          
echo $obj->my_func_1(11)%$obj->my_func_2(10);   //Выведет '1'
?> 

Решение задачи №1.6.8

1.6.9. Объявите два трейта, а в каждом из них по одному общедоступному методу, каждый из которых должен принимать по одному аргументу, а затем просто возвращать его. Реализуйте оба трейта в классе. Создайте объект класса и выведите на экран остаток от деления результата вызова первого метода на результат вызова второго метода. Методам в качестве аргументов передайте целые числа, которые вы использовали в предыдущей задаче с интерфейсами. Сравните результаты. Не забывайте, что при реализации трейтов в классе используется служебное слово use, при этом разрешается наследовать сразу несколько трейтов, разделяя их запятыми. Показать решение.

<?php
trait my_trait_1{                  //Объявляем первый трейт
   public function my_func_1($a){  //Метод принимает 1 аргумент
		 return $a;
	} 
}
 
trait my_trait_2{                  //Объявляем второй трейт
   public function my_func_2($b){  //Метод принимает 1 аргумент
		 return $b;
	} 
}
  
class my_class{
   use  my_trait_1,  my_trait_2;   //Реализуем трейты в классе
}
 
$obj= new my_class();          
echo $obj->my_func_1(11)%$obj->my_func_2(10);   //Выведет '1'
?> 

Решение задачи №1.6.9

1.6.10. Измените условие предыдущей задачи, объявив методы защищенными и задав им одинаковые имена. Реализуйте оба трейта в классе. Создайте объект класса и выведите на экран остаток от деления результата вызова первого метода на результат вызова второго метода. Методам в качестве аргументов передайте целые числа, которые вы использовали в предыдущей задаче. Сравните результаты. Не забывайте, что при реализации трейтов, у которых присутствуют методы с одинаковыми именами, используются служебные слова insteadof и as. Первое из них позволяет указать, метод которого из трейтов следует использовать, а второй позволяет изменить область видимости метода или же использовать его под другим именем. Показать решение.

<?php
trait my_trait_1{                 	  //Объявляем первый трейт
   protected function my_func_1($a){  //Защищенный метод принимает 1 аргумент
		 return $a;
	} 
}
 
trait my_trait_2{                 	  //Объявляем второй трейт
   protected function my_func_1($b){  //Защищенный метод принимает 1 аргумент
		 return $b;
	} 
}
  
class my_class{
   use  my_trait_1, my_trait_2{	 	  //Реализуем трейты в классе
	 my_trait_1::my_func_1 insteadof my_trait_2; //Используем метод 1-го трейта
	 my_trait_1::my_func_1 as public;  	 //Расширяем область видимости метода
	 my_trait_2::my_func_1 as public my_func_2;  //Используем под другим именем
	}
}
 
$obj= new my_class();          
echo $obj->my_func_1(11)%$obj->my_func_2(10);    //Выведет '1'
?>  

Решение задачи №1.6.10

1.6.11. Объявите трейт, в котором создайте защищенный метод, принимающий один аргумент, а затем просто возвращающий его. Теперь объявите интерфейс и создайте в нем общедоступный метод без тела, который после реализации должен будет принимать один аргумент. Создайте переменную и присвойте ей анонимный класс, в котором будут реализованы как интерфейс, так и трейт. Метод интерфейса после реализации должен просто возвращать свой аргумент. Не забудьте также расширить область видимости метода трейта. Выведите на экран остаток от деления результата вызова первого метода на результат вызова второго метода. Методам в качестве аргументов передайте целые числа, которые вы использовали в предыдущих задачах. Сравните результаты. Показать решение.

<?php
trait my_trait{                 	  //Объявляем первый трейт
   protected function my_func_1($a){  //Защищенный метод принимает 1 аргумент
		 return $a;
	} 
}
 
interface my_interface{               //Объявляем второй интерфейс
  public function my_func_2($b);  	  //Метод должен принимать 1 аргумент
}
  
$obj= new class implements my_interface{
   use  my_trait{ 	 				  //Реализуем трейт 
		my_trait::my_func_1 as public;//Расширяем область видимости метода
	}
	
	public function my_func_2($b){	  //Реализуем метод интерфейса 
		return $b;
	}
	
};  //Не забываем про точку с запятой 
          
echo $obj->my_func_1(11)%$obj->my_func_2(10); //Выведет '1'
?>  

Решение задачи №1.6.11

1.6.12. Создайте переменную и присвойте ей анонимный класс, в котором определите два общедоступных свойства, одно защищенное и одно закрытое. Перечислите свойства снаружи класса при помощи цикла foreach. Объясните результат. Показать решение.

<?php
$a=new class{
   public $public_var_1='value_1';           //Общедоступное 
   public $public_var_2='value_2';           //Общедоступное 
    
   protected $protected_var='protected_var'; //Защищенное
   private   $private_var='private_var';     //Закрытое
  };
 
foreach($a as $key=>$value){					//Перечисляем снаружи класса
    echo "{$key}=>{$value}".'<br>';
}

/* Цикл получит доступ только к доступным свойствам объекта. Для доступа ко 
	всем свойствам класса цикл должен располагаться внутри данного класса */
?>  

Решение задачи №1.6.12

1.6.13. Создайте класс, объявите в нем два общедоступных свойства, а также метод __clone, который будет увеличивать значение первого свойства на единицу. Значение первого свойства, соответственно, установите в 0, а второму присвойте строку 'Неизменяемое свойство'. Создайте экземпляр класса и выведите на экран значения свойств. Затем клонируйте объект и выведите на экран значения свойств клона. Объясните полученный результат. Показать решение.

<?php
class my_class{
   public $var_1=0;              
   public $var_2='Неизменяемое свойство';              
	
   public function __clone(){     //Метод запускается только при клонировании 
     ++$this->var_1;              //объекта и увеличивает $var_1 на 1
   }
}
 
$obj_1 = new my_class();   		  //Создаем объект класса cloneable_class
echo $obj_1->var_1.'<br>';        //Выведет '0' 
echo $obj_1->var_2.'<br>'.'<br>';        //Выведет 'Неизменяемое свойство' 
 
//Клонируем $obj_1, при этом создается реальный объект-клон с запуском метода__clone 
$obj_2=clone $obj_1;             
echo $obj_2->var_1.'<br>';        //Выведет '1'     
echo $obj_2->var_2.'<br>';        //Выведет 'Неизменяемое свойство'
?> 

Решение задачи №1.6.13

1.6.14. Присвойте переменной анонимный класс. В классе объявите закрытое свойство, но не инициализируйте его. Для того, чтобы получить возможность инициализации свойства вне класса используйте метод перегрузки __set, а для получения его значения – метод __get. Сделайте так, чтобы в случае неинициализированного свойства метод выводил соответствующее предупреждение. После оформления класса попытайтесь вывести значение свойства на экран. Затем присвойте свойству значение и повторите попытку. Объясните результат. Показать решение.

<?php
$a = new class{
   private $private_var; //Объявили закрытое свойство, но не инициализировали 
       
   //Метод автоматически вызывается в случае обращения к недоступным свойствам
   public function __set($name, $value){ 
      $this->$name=$value;    //Устанавливаем значение недоступного свойства
   }
    
   //Метод возвращает значение недоступного свойства, если оно установлено,  
   //или выводит сообщение, если такого свойства нет или оно не инициализировано
   public function __get($name){
      //Если переменная установлена значением отличным от null
      if(isset($this->$name)){
         return  $this->$name;//возвращаем значение недоступного свойства
      }else{
         echo "Свойство {$name} отсутствует или не определено в данном классе";
      }
   }
};
                 
echo $a->private_var.'<br>';  //Метод перегрузки __get() выведет сообщение 
                              
$a->private_var=10;     	     //Изменяем значение закрытого свойства вне класса,
                              //что возможно благодаря методу перегрузки __set()
echo $a->private_var;         //Выведет 10
?> 

Решение задачи №1.6.14

1.6.15. Задайте режим строгой типизации (используйте инструкцию declare(strict_types=1);), после чего объявите класс A. В нем создайте общедоступный метод, который будет просто возвращать свой числовой (!) аргумент. Затем создайте еще один общедоступный статический метод, который будет принимать два числовых аргумента, а затем выводить на экран произведение вызова первого метода, которому будет передаваться в качестве аргумента первый аргумент данного статического метода, на второй аргумент метода. На первый метод сошлитесь при помощи конструкции self::. Создайте класс-потомок B, в котором переопределите первый метод таким образом, чтобы он возвращал не сам аргумент, а его квадрат. После оформления вызовите из второго класса первый метод. Объясните результат. Замените в скрипте конструкцию self:: на static:: и вызовите метод повторно. Объясните изменение результата. Показать решение.

<?php
declare(strict_types=1);

class A{
   public function return_val(int $a){
      return $a;
   }
   public static function mult_ab(int $a, int $b){
      echo self::return_val($a)*$b;
		//echo static::return_val($a)*$b;
   }
}
 
class B extends A {
   public function return_val(int $a){
      return $a*$a;
   }
}
 
B::mult_ab(5,10); //Выведет 50, т.к. функция mult_ab использует  
                  //ссылку self::, которая использует область видимости
                  //того класса, в котором она была определена, а не используется
						
//B::mult_ab(5,10); //Выведет 250, т.к. функция mult_ab использует позднее
             //статическое связывание при помощи ссылки static::, которая использует 
             //область видимости класса, в котором она используется, а не определена						
?>  

Решение задачи №1.6.15

§1.7. Пространства имен

1.7.1. Объявите пространство имен, в котором создайте константу, функцию и класс. В функции реализуйте вывод на экран значения переданного ей аргумента. В классе объявите общедоступное статическое свойство, которому присвойте число, а также общедоступный метод, который будет возвращать сумму аргументов. Создайте переменную и присвойте ей объект класса. Находясь в данном пространстве имен, выведите на экран значение константы, осуществите вызов функции, выведите на экран значение свойства класса и значение вызова метода класса. Далее объявите глобальное пространство, в котором также выведите на экран значение константы, осуществите вызов функции, выведите на экран значение свойства класса и значение вызова метода класса. Показать решение.

<?php
namespace my_name_space{ //Объявили пространство имен
	//Объявляем константу в текущем пространстве имен 
	const my_const = 'Константа';    
		
	//Объявляем функцию в текущем пространстве имен
	function my_func($arg){
		echo $arg.'<br>';
	}
	
	//Объявляем класс в текущем пространстве имен
	class my_class{
		public static $b=5; //Объявили статическое свойство
		
		//Объявляем общедоступный метод класса
		public function my_method($arg_1, $arg_2){
			return $arg_1+$arg_2;
		}
	}
	
	$a=new my_class; //Создали объект класса
	
	//В текущем пространстве имен можно использовать неполные имена
	echo my_const.'<br>';
	my_func(10).'<br>';
	echo my_class::$b.'<br>';
	//Переменные не зависят от пространства имен
	echo $a->my_method(3,5).'<br>';
}

namespace{
	//Везде добавляем префикс 'my_name_space\' нашего пространства имен,
	//дополняя до полного имени
	echo my_name_space\my_const.'<br>';
	my_name_space\my_func(10).'<br>';
	echo my_name_space\my_class::$b.'<br>';
	//Переменные не зависят от пространства имен
	echo $a->my_method(3,5).'<br>';
}
?> 

Решение задачи №1.7.1

1.7.2. Объявите пространство имен, в котором создайте константу, переменную $b, функцию и класс. Переменной присвойте какое-нибудь число. В функции реализуйте возврат переданного ей аргумента. В классе объявите общедоступный статический метод, выводящий на экран сумму квадратов двух чисел. Далее объявите какое-нибудь подпространство, куда импортируйте константу, функцию и класс созданного ранее пространства имен, использовав их под псевдонимами C, F, CL. Находясь в созданном подпространстве выведите на экран значение константы C, переменной $b, вызова функции F и вызова метода класса CL. Показать решение.

<?php
namespace my_name_space{ //Объявили пространство имен
	//Объявляем константу в текущем пространстве имен 
	const my_const = 'Константа';    
		
	$b=7; //Присвоили переменной число
	
	//Объявляем функцию в текущем пространстве имен
	function my_func($arg){
		return $arg;
	}
	
	//Объявляем класс в текущем пространстве имен
	class my_class{
		//Объявляем статический метод класса
		public static function my_method($arg_1, $arg_2){
			echo $arg_1*$arg_1+$arg_2*$arg_2;
		}
	}
}

namespace my_name_space\inside{
	//Импортируем и создаем псевдонимы
	use const my_name_space\my_const as C;
	use function my_name_space\my_func as F;
	use my_name_space\my_class as CL;
	
	//Теперь просто используем псевдонимы
	echo C.'<br>';
	echo F(10).'<br>';
	CL::my_method(3, 5);
}
?> 

Решение задачи №1.7.2

§2.1. Краткий обзор некоторых встроенных возможностей PHP

2.1.1. Дан массив ["Dima", 11, true, null, [33,44], 1.23]. Нужно вывести информацию о его элементах на экран. Каждый вывод информации об элементе массива должен нумероваться, начиная с единицы. Для решения задачи используйте цикл foreach и функцию var_dump(). Показать решение.

<?php
//Массив с переменными
$m=["Dima", 11, true, null, [33,44], 1.23];

//Выводим данные о значениях массива
foreach($m as $key=>$val){
	//Чтобы нумерация шла с 1
	$n=$key+1;
	//Выводим информацию об элементе массива
	var_dump($val);
	echo " - {$n}-й элемент массива<br>";
}
?>

Решение задачи №2.1.1

2.1.2. Дан тот же массив ["Dima", 11, true, null, [33,44], 1.23]. Нужно вывести информацию о типе каждого его элемента на экран, например, "3-й элемент массива является строкой". Каждый вывод информации о типе элемента массива должен нумероваться, начиная с единицы. Для решения задачи используйте цикл foreach, оператор switch и функции is_int, is_string и т.д. Полный список функций посмотрите в официальном справочнике. Показать решение.

<?php
//Массив с переменными
$m=["Dima", 11, true, null, [33,44], 1.23];

//Выводим данные о значениях массива
foreach($m as $key=>$val){
	//Чтобы нумерация шла с 1
	$n=$key+1;
	
	switch(true){
		case is_int($val):
			echo "{$n}-й элемент массива ". 
				 "является целым числом".'
'; break; case is_double($val): echo "{$n}-й элемент массива ". "является вещественным числом".'
'; break; case is_string($val): echo "{$n}-й элемент массива ". "является строкой".'
'; break; case is_array($val): echo "{$n}-й элемент массива ". "является массивом".'
'; break; case is_bool($val): echo "{$n}-й элемент массива ". "относится к логическому типу данных".'
'; break; case is_null($val): echo "{$n}-й элемент массива ". "является значением NULL".'
'; break; default: echo "Скрипт не может определить тип данных."; } } ?>

Решение задачи №2.1.2

2.1.3. Создайте массив, в который поместите все натуральные числа, не превышающие 20. Теперь измените все четные значения массива, увеличив их в три раза. Выведите их на экран. Для решения задачи создайте соответствующую callback-функцию, передав ей аргумент по ссылке, а затем используйте функцию array_walk(), передав ей в качестве второго аргумента созданную callback-функцию. Не забудьте посмотреть описание функции в официальном справочнике. Показать решение.

<?php
//Создаем пустой массив. Можно и $m=array();
$m=[];
//Циклом заполняем его
for($n=1;$n<=20;$n++){
	//Добавляем текущее число n в массив
	$m[]=$n;
}

//Создаем callback-функцию передав аргумент по ссылке
function my_func(&$val){
   //Если элемент массива четное число
   if($val%2==0){
	//Увеличиваем его в 3 раза
	$val*=3; 
	}
}

//Применяем callback-функцию к каждому элементу массива
array_walk($m,"my_func");
//Выводим элементы массива на экран через пробел
foreach($m as $value){
	echo $value.' ';	
}		
?>

Решение задачи №2.1.3

2.1.4. Создайте массив, в который поместите все натуральные числа, не превышающие 15. Отфильтруйте полученный массив при помощи функции array_filter(), удалив из массива все нечетные значения. Выведите оставшиеся элементы массива на экран. Показать решение.

<?php
//Создаем пустой массив. Можно и $m=array();
$m=[];
//Циклом заполняем его
for($n=1;$n<=15;$n++){
	//Добавляем текущее число n в массив
	$m[]=$n;
}

//Создаем callback-функцию для фильтрации элементов
function my_func($val){
   //Если элемент массива нечетное число
   if($val%2!=0){
	//Возвращаем FALSE, чтобы элемент был удален из массива
	return false; 
	}
	//Возвращаем TRUE для четного элемента массива
	return true;
}

//Фильтруем элементы массива
$m = array_filter($m,"my_func");
//Выводим четные элементы массива на экран через пробел
foreach($m as $value){
	echo $value.' ';	
}		
?>

Решение задачи №2.1.4

2.1.5. Создайте массив, в который поместите все простые числа, не превышающие числа 25. Далее отсортируйте элементы массива так, чтобы они шли по убыванию, т.е. в обратном порядке, и выведите их на экран. Напомним, что натуральное число, большее единицы, называется простым, если оно делится без остатка только на единицу и на само себя. Показать решение.

<?php
//Создаем пустой массив. Можно и $m=array();
$m=[];
//Проверяем числа от 2 до 25
for($p=2;$p<=25;$p++){
	//Узнаем остаток от деления на числа от 2 до p-1
	for($d=2;$d<$p;$d++){
		//Если делится нацело, то р уже не простое
		if($p%$d==0){
			//Пропускаем итерации обоих циклов
			continue 2;	
		}
	}
	//Если итерация не была пропущена,
	//заносим простое число р в массив
	$m[]=$p;
}

//Меняем порядок следования элементов массива
$m=array_reverse($m);

echo 'Количество простых чисел на отрезке [2,25]: '.count($m);
echo '<br> Это числа (по убыванию): ';

//Выводим элементы массива на экран через пробел
foreach($m as $val){
	echo $val.' ';	
}		
?>

Решение задачи №2.1.5

2.1.6. Выделите из строки 'Иван_Иванов' имя и фамилию и выведите их на экран. Используйте для поиска позиции первого вхождения разделителя в строку функцию mb_strpos(), а для получения требуемых подстрок функцию mb_substr(). Опять же, обязательно смотрите описание функций в соответствующем разделе официального справочника. Показать решение.

<?php
//Заносим требуемую строку в переменную
$fool_name='Иван_Иванов';

//Ищем позицию разделителя
$delimiter=mb_strpos($fool_name,'_');

//Выделяем имя
$first_name=mb_substr($fool_name,0,$delimiter);
//Выделяем фамилию (разделитель не включаем)
$last_name=mb_substr($fool_name,$delimiter+1);

echo 'Имя: '.$first_name.'<br>';
echo 'Фамилия: '.$last_name;
?>

Решение задачи №2.1.6

2.1.7. Создайте функцию match_letter(), которая будет в качестве первого аргумента принимать строку $str и проверять ее на соответствие допустимым символам массива $alphabet, который будет передаваться в качестве второго аргумента. Результат проверки функция должна выводить на экран. Проверьте с помощью этой функции на наличие запрещенных символов строки 's-1', 'S_20' и '3_S', если в качестве массива допустимых символов передается массив ['s','_','1','2','3']. Для решения задачи используйте внешний цикл for по всем символам строки (длину строки можно узнать при помощи mb_strlen()), а также внутренний цикл for по всем элементам массива (число элементов массива можно узнать при помощи count()). Во внутреннем цикле следует сравнивать текущий символ строки со всеми символами массива, чтобы установить его допустимость. Если вы не смогли решить задачу, обязательно разберите код решения, заглядывая в официальный справочник, и наберите код самостоятельно!!! Показать решение.

<?php
//Формируем массив разрешенных символов 
$alphabet = ['s','_','1','2','3'];

//Определим функцию соответствия символов в проверяемой  
//строке символам заданного массива
function match_letter($str, $arr){
	
	//Запустим цикл по всем символам $str. Здесь mb_strlen() 
	//возвращает длину многобайтовой строки в символах
	for($i=0; $i<mb_strlen($str); $i++){
		
		//Зададим счетчик совпадений.
		$match_counter=0;
		
		//А теперь зададим цикл по всем элементам массива.
		for($k=0;$k<count($arr);$k++){
			//И сравним i-й символ переданной строки со всеми 
			//символами переданного массива (без учета регистра)
			if(mb_strtolower(mb_substr($str,$i,1))==$arr[$k]){
				//Если найдем соответствие, значит символ корректен 
				//Присвоим счетчику 1 и прервем внутренний цикл
				$match_counter=1;
				break;
			} 
		}
		
		//Если после завершения внутреннего цикла совпадений 
		//не найдено, выводим предупреждение и завершаем вызов вункции
		if($match_counter==0){
			echo "Извините, строка '{$str}' содержит недопустимые символы!<br>";
			return 0;
		}
	}
	
	//Если все ок, то сообщаем об этом
	echo "Строка '{$str}' разрешена!<br>";
}

//Формируем строки для проверки
$str_1='s-1';
$str_2='S_20';
$str_3='3_S';

//Проверяем строки на наличие недопустимых символов
match_letter($str_1, $alphabet);
match_letter($str_2, $alphabet);
match_letter($str_3, $alphabet);
?>

Решение задачи №2.1.7

2.1.8. Вычислите выражение (sin30°+3/4)/|1/5-3/7|+log10100. Для решения используйте математические функции, имеющиеся в PHP. Показать решение.

<?php
//Составим выражение и выведем результат 
echo (sin(deg2rad(30))+3/4)/abs(1/5-3/7)+log10(100);
?>

Решение задачи №2.1.8

2.1.9. Выведите на экран время по Минску в виде двух строк следующего формата: Дата: 21.02.2018 (Среда), Время: 16ч. 20мин. 37сек. Для установки часового пояса Минска используйте date_default_timezone_set(), названия дней недели переведите на русский при помощи оператора switch и массива, возвращаемого функцией getdate(). Чтобы в формате даты месяцы до десятого шли с нулем, используйте условный оператор if с соответствующим условием. Показать решение.

<?php
//Устанавливаем временную зону сервера
//Мой сервер находится в Минске
date_default_timezone_set('Europe/Minsk');

//Получаем текущую дату (массив)
$s_d=getdate();

//Переводим дни недели на русский
switch(true){
	
	case $s_d['weekday']=='Monday':
		$s_day_ru='Понедельник';
	break;

	case $s_d['weekday']=='Tuesday':
		$s_day_ru='Вторник';
	break;
	
	case $s_d['weekday']=='Wednesday':
		$s_day_ru='Среда';
	break;
	
	case $s_d['weekday']=='Thursday':
		$s_day_ru='Четверг';
	break;
	
	case $s_d['weekday']=='Friday':
		$s_day_ru='Пятница';
	break;
	
	case $s_d['weekday']=='Saturday':
		$s_day_ru='Суббота';
	break;
	
	case $s_d['weekday']=='Sunday':
		$s_day_ru='Воскресенье';
	break;
	
	default: $s_day_ru='';
}

//Заносим в переменную порядковый номер месяца
$m=$s_d['mon'];

//Добавляем нули к месяцам
if($m<10){
	$m='0'.$m;
}

echo <<<HD
Минское время<br>
Дата: {$s_d['mday']}.{$m}.{$s_d['year']} ({$s_day_ru})<br>
Время: {$s_d['hours']}ч. {$s_d['minutes']}мин. {$s_d['seconds']}сек.
HD;
?>

Решение задачи №2.1.9

2.1.10. Установите пользователю куки на десять секунд с датой последнего посещения страницы. Дата должна выводиться ему при каждом новом посещении в формате "Прошлый раз вы посещали страницу 21.2.2018 в 18ч. 18мин. 41сек. по Минскому времени". В случае первого посещения страницы выведите соответствующее сообщение. Для получения массива с данными даты сервера используйте функции предыдущей задачи. Показать решение.

<?php
//Устанавливаем временную зону сервера
//Мой сервер находится в Минске
date_default_timezone_set('Europe/Minsk');

//Получаем текущую дату (время сервера)
$s_d=getdate();

//Составляем строку с датой
$visit_time = <<<HD
Прошлый раз вы посещали страницу 
{$s_d['mday']}.{$s_d['mon']}.{$s_d['year']}
в {$s_d['hours']}ч. {$s_d['minutes']}мин. {$s_d['seconds']}сек. 
по Минскому времени.
HD;

//Устанавливаем куки на 10 секунд, но оно будет доступно
//в массиве только при следующем посещении, пока же 
//там содержится старое значение
setcookie('last_vst',$visit_time,time()+10); 

//Проверяем, было ли уже установлено cookie, если да, то
if(isset($_COOKIE['last_vst'])){  
	//Выводим сообщение
	echo $_COOKIE['last_vst'];
//Если же посещение первое или куки истекли
}else{
	//Выводим сообщение
	echo "Вы либо давно к нам не заходили, 
		 либо посещаете нас впервые!";
}
?>

Решение задачи №2.1.10

2.1.11. Напишите простейший скрипт счетчика посещений страницы на основе сессий. Для хранения данных счетчика используйте суперглобальный массив $_SESSION. Показать решение.

<?php
//Стартуем сессию
session_start();  

//Проверяем, запущен ли счетчик
if(isset($_SESSION['times'])){  
	//увеличиваем его значение на единицу
	$_SESSION['times']+=1; 
}else{
	//иначе присваиваем счетчику начальное значение
	$_SESSION['times']=1; 
}

//Выводим информацию на экран
echo 'Количество посещений страницы: '.$_SESSION['times'];
?>

Решение задачи №2.1.11

§2.2. Расширения для работы с файловой системой

2.2.1. Если вы еще не создали на локальном сервере папку test, сделайте это (если возникнут трудности посмотрите соответствующий видеоурок по подготовке учебного места здесь). Она будет служить корневой папкой нашего учебного сайта на локальном сервере.
Создайте в папке файл start_file.php со скриптом, который будет проверять наличие в текущей корневой папке и, в случае необходимости, создавать файлы .htaccess и index.html. Если создаваемый файл уже будет существовать либо возникнет ошибка создания файла, скрипт должен будет вывести соответствующее предупреждение. Запустите скрипт пару раз. Затем удалите один из созданных файлов, еще раз запустите скрипт и посмотрите результ. Для решения задачи используйте функции file_exists() и touch(). Показать решение.

<?php
//Проверяем существование файла .htaccess
if(file_exists('.htaccess')){
	echo 'Файл .htaccess уже существует!<br>';
}else{
	//Пытаемся создать файл
	if(touch('.htaccess')){
		echo 'Файл .htaccess успешно создан!<br>';
	}else{
		echo 'Ошибка создания файла .htaccess!<br>';
	}
}

//Проверяем существование файла index.html
if(file_exists('index.html')){
	echo 'Файл index.html уже существует!';
}else{
	//Пытаемся создать файл
	if(touch('index.html')){
		echo 'Файл index.html успешно создан!';
	}else{
		echo 'Ошибка создания файла index.html!';
	}
}
?> 

Решение задачи №2.2.1

2.2.2. Запишите в файл .htaccess, созданный в предыдущей задаче, следующее содержимое.

AddType application/x-httpd-php .html .htm .js
php_flag display_errors on

Выведите содержимое файла и его размер на экран. Для записи используйте функцию file_put_contents(), которая в случае необходимости требуемый файл сперва создаст, а для получения содержимого функцию file_get_contents(). Чтобы содержимое выводилось на экран в две строки, используйте функцию nl2br(), которая добавит перед переносом строки <br>. Показать решение.

<?php
//Записываем требуемое содержимое в переменную
//Теперь php-код будет искаться и в таких файлах
//А ошибки скриптов выводиться на экран
$str=<<<HD
AddType application/x-httpd-php .html .htm .js
php_flag display_errors on
HD;
			
//Добавляем строку в файл в режиме перезаписи
//а если файл не существует, то сперва создаем его
if(file_put_contents('.htaccess',$str)){ 
	//Узнаем новый размер файла
	$size=filesize('.htaccess');
	 
	//Выведем обновленное содержимое на экран
	echo 'Файл был успешно записан содержимым: '.'<br><br>';
	//nl2br() вставляет <br> перед символами переноса строк
	echo nl2br(file_get_contents('.htaccess')).'<br><br>';
	echo 'Размер записанного файла: '.$size.' байт.<br>';
}else{
	echo 'Какая-то ошибка, файл записан не был!';	
}
?> 

Решение задачи №2.2.2

2.2.3. Запишите в файл index.html, созданный в задаче 2.2.1, следующее содержимое.

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">  
   <title>Запись и чтение файлов</title>
</head>
<body>
   Данный файл был записан функцией file_put_contents()
</body>
</html>

Выведите содержимое файла на экран. На этот раз для записи используйте функцию fopen() в режиме 'wb', а также функции fwrite() и fclose(). Для получения содержимого опять используйте функцию file_get_contents(). Показать решение.

<?php
//Записываем требуемое содержимое в переменную
$str_2=<<<HD
<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">  
   <title>Запись и чтение файлов</title>
</head>
<body>
   Данный файл был записан функцией fwrite()
</body>
</html>
HD;
			
//Открываем файл в режиме перезаписи и заносим
//дескриптор файла в переменную
$handle=fopen('index.html','wb'); 
//После получения доступа записываем строку в файл
fwrite($handle,$str_2); 
//После завершения работы с файлом не забываем закрыть его
fclose($handle); 
 
//Выведем конечное содержимое на экран
echo nl2br(file_get_contents('index.html'));
?> 

Решение задачи №2.2.3

2.2.4. Создайте при помощи php-скрипта в корневом каталоге test на локальном сервере каталог css, а в нем файл styles.css. В случае существования директории либо возникновения ошибки, скрипт должен выводить соответствующее предупреждение. Для создания каталога используйте функцию mkdir(). При этом учтите, что функция в случае неудачи не только возвращает false, но и выводит ошибку уровня E_WARNING. Поэтому сначала присвойте результат выполнения функции переменной, использовав перед выражением оператор подавления ошибок '@', и только затем составляйте условную конструкцию с оператором if. Показать решение.

<?php
//Создаем директорию в папке со скриптом
//Используем оператор подавления ошибки, если
//окажется, что директория уже создана
@ $m=mkdir('css');

//Выводим соответствующее сообщение
if($m){
	echo 'Директория успешно создана!<br>';
}else{
	echo 'Ошибка создания директории!';
	//прерываем скрипт
	die();
}
 
//В созданной директории создаем файл
if(touch('css/styles.css')){
	echo 'Файл успешно создан!';
}else{
	//Выводим предупреждение и
	echo 'Ошибка создания файла!';
}
?> 

Решение задачи №2.2.4

2.2.5. Если вы решили все предыдущие задачи, то в корневом каталоге test на локальном сервере должны присутствовать: файлы .htaccess и index.html, каталог css, а в нем файл styles.css, а также файл со скриптом edit_file.php. Теперь создайте в корневой папке при помощи скрипта еще один каталог php и переместите туда сам php-файл со скриптом. Показать решение.

<?php
//Создаем директорию в папке со скриптом
//Используем оператор подавления ошибки, если
//окажется, что директория уже создана
@ $m=mkdir('php');

//Выводим соответствующее сообщение
if($m){
	echo 'Директория успешно создана!<br>';
}else{
	echo 'Ошибка создания директории!';
	//прерываем скрипт
	die();
}
 
//Переносим файл в созданную директорию
if(rename('edit_file.php', 'php/edit_file.php')){
	echo 'Файл успешно перемещен!';
}else{
	//Выводим предупреждение
	echo 'Ошибка перемещения файла!';
}
?> 

Решение задачи №2.2.5

2.2.6. Запишите в файлы styles.css и index.html следующее содержимое.

body{
color: blue;
}

и

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">  
   <title>Запись и чтение файлов</title>
   <link rel="stylesheet" href="css/styles.css">
</head>
<body>
   Данный файл был записан функцией file_put_contents()
</body>
</html>

При использовании относительных адресов учтите новое место расположение файла со скриптом (он теперь находится в каталоге php). Показать решение.

<?php
//Записываем требуемое содержимое в переменную
$str=<<<HD
body{
color: blue;
}
HD;
             
//Добавляем строку в файл в режиме перезаписи
//а если файл не существует, то сперва создаем его
if(file_put_contents('../css/styles.css',$str)){ 
    echo 'Запись в файл  прошла успешно!<br>';
}else{
    echo 'Какая-то ошибка, styles.css записан не был!<br>';
	die();	
}

//Записываем требуемое содержимое в переменную
//Подключаем таблицу стилей styles.css
$str_2=<<<HD
<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">  
   <title>Запись и чтение файлов</title>
   <link rel="stylesheet" href="css/styles.css">
</head>
<body>
   Данный файл был записан функцией file_put_contents()
</body>
</html>
HD;
             
//Добавляем строку в файл в режиме перезаписи
//а если файл не существует, то сперва создаем его
if(file_put_contents('../index.html',$str_2)){ 
    echo 'Запись в файл index.html прошла успешно!<br>';
}else{
    echo 'Какая-то ошибка, index.html записан не был!';   
}
?> 

Решение задачи №2.2.6

2.2.7. Удалите вручную содержимое корневой папки за исключением файла .htaccess. Создайте в ней (опять же, вручную) php-файл incl_file.php, скрипт которого будет выводить на страницу строку 'Я была вставлена скриптом PHP!'. Создайте индексный файл и подключите файл incl_file.php в тело документа. Для этого используйте оператор include_once. Показать решение.

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">  
   <title>Подключение php-файлов к html-странице</title>
</head>
<body>
     
<?php
	//Подключаем скрипт php
	include_once $_SERVER['DOCUMENT_ROOT'].'/test/incl_file.php';
?> 
</body>
</html>

Решение задачи №2.2.7

§2.3. Работа с формами

2.3.1. Создайте форму, состав и внешний вид полей которой показан на скриншоте. Скрипт, который будет обрабатывать данные формы на сервере, должен выводить либо сообщения с данными формы либо просить заполнить все поля формы (см. скриншот задачи). Для проверки заполнения полей имени и фамилии используйте условный оператор if и функцию mb_strlen(). Не забывайте, что после скачивания файла содержимое папки нужно разместить в корневой папке test нашего учебного сайта на локальном сервере (иначе скрипт работать не будет). Показать решение.

Условие задачи №2.3.1


<html>
<head>
   <meta charset="utf-8">  
   <title>Отправка простых текстовых данных</title>
</head>
<body>
   <form action="php/example_2_3_1.php" method="POST" name="form_2_3_1"> 
		Введите имя  &nbsp; <input type="text" name="firstName"><br><br>
		Введите фамилию  &nbsp; <input type="text" name="lastName"><br><br>

		Укажите ваш возраст: &nbsp; 
		<!-- Создаем раскрывающийся список -->
		<select name="age">
			<option value="до 18 лет">до 18 лет</option>
			<option value="19-30 лет">19-30 лет</option>
			<option value="30-50 лет">30-50 лет</option>
			<option value="50 лет и старше">50 лет и старше</option>
		</select> <br><br> 

		Предпочитаете &nbsp; 
		<input type="radio" name="user_choice" value="овощи" checked>овощи &nbsp; 
		<input type="radio" name="user_choice" value="фрукты">фрукты<br><br>
		<button type="submit" name="submit" value="send">Отправить</button>
   </form>
</body>
</html>
<?php
//Достаем данные из суперглобального массива $_POST
//и присваиваем их переменным для удобства использования
$firstName = $_POST["firstName"];
$lastName = $_POST["lastName"];
$age = $_POST["age"];
$user_choice = $_POST["user_choice"];

//Проверяем, чтобы были введены символы в поля
if(mb_strlen($firstName)>1&&mb_strlen($lastName)>1){
	//Выводим сообщение
	echo 'Ваш возрастной диапазон: '.$age.'.<br>';
	echo 'Ваше имя: '.$firstName.' '.$lastName.'.<br>';
	echo 'Вы предпочитаете: '.$user_choice.'.';	 
}else{
	echo 'Правильно заполните поля формы!';	
}
?> 

Решение задачи №2.3.1

2.3.2. Создайте форму, состав и внешний вид полей которой показан на скриншоте. Скрипт, который будет обрабатывать данные формы на сервере, должен проверять заполнение полей имени и фамилии и в случае ошибки выводить предупреждение и прерывать скрипт. Что касается аватарки, то скрипт должен либо вывести аватарку после имени и фамилии, либо сообщить о незагруженной аватарке (см. скриншот задачи). Для получения имени, размера и временной папки для хранения загруженных файлов используйте суперглобальный массив $_FILES. Для перемещения загруженной аватарки в целевую папку используйте функцию move_uploaded_file() (в качестве целевой создайте папку avatars). Чтобы правильно указать путь к вставляемой на страницу аватарке, не забудьте начать его с http://localhost/test/. Показать решение.

Условие задачи №2.3.2

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">  
   <title>Загрузка файлов на сервер</title>
</head>
<body>
   <form action="php/example_2_3_2.php" method="POST" enctype="multipart/form-data"> 
		Введите имя  &nbsp; <input type="text" name="firstName"><br><br>
		Введите фамилию  &nbsp; <input type="text" name="lastName"><br><br>

		Загрузите аватарку:<br><br>
		<input type="file" name="avatar"><br><br>
		
		<button type="submit" name="submit" value="send">Отправить</button>
		<button type="reset" name="reset" value="send">Сброс</button>
   </form>
</body>
</html>
<?php
//Достаем данные из суперглобального массива $_POST
//и присваиваем их переменным для удобства использования
$firstName = $_POST["firstName"];
$lastName = $_POST["lastName"];

//Проверяем, чтобы были введены символы в поля
if(mb_strlen($firstName)>1&&mb_strlen($lastName)>1){
	//Выводим сообщение
	echo $firstName.' '.$lastName.'<br>';
}else{
	echo 'Правильно заполните поля формы!';
	die();	
}

//Теперь проверим, чтобы файл был успешно загружен 
if(isset($_FILES['avatar']['name'])&&$_FILES['avatar']['size']>0){
	//Заносим в переменную его родное имя
	$avatar_name=$_FILES['avatar']['name'];
	//Заносим в переменную путь к временной папке
	$avatar_tmp = $_FILES['avatar']['tmp_name'];
	
	//Если файл будет перемещен, функция вернет true
	if(move_uploaded_file($avatar_tmp, "../avatars/{$avatar_name}")){
		//Путь к корневой папке на сервере
		$path="http://localhost/test/";
		//Выводим аватарку
		$avatar_img='<img src="'.$path.'avatars/'.$avatar_name.'">';
		//Показываем загруженную аватарку
		echo $avatar_img;
	}else{
		//Ничего не выводим
		echo 'Ошибка загрузки аватарки!';
	}
	
}else{
	//Ничего не выводим
	echo 'Аватарка не загружена!';
}	
?> 

Решение задачи №2.3.2

2.3.3. Хорошо изучите пример 10.14 в учебнике, в котором используется форма, ссылающаяся сама на себя. Создайте в корневой папке test страницу с такой формой, добавив в нее кнопку 'Сбросить'. Что касается php-скрипта, то его нужно усложнить. Скрипт должен делать проверку заполнения полей имени и фамилии и в случае ошибки прерывать дальнейшее выполнение скрипта и выводить сообщение. Также скрипт должен проверять, был ли сделан выбор предпочтения и в зависимости от этого делать соответствующий вывод (см. скриншот). Показать решение.

Условие задачи №2.3.3

<?php
//$_SERVER['PHP_SELF'] содержит имя текущего скрипта относительно корня сайта
$our_form=<<<HD
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">    
    <title>Форма, которая ссылается сама на себя</title>
</head>
<body>
    <form action="{$_SERVER['PHP_SELF']}" method="POST"> 
        Введите имя  &nbsp; <input type="text" name="firstName"><br><br>
        Введите фамилию  &nbsp; <input type="text" name="lastName"><br><br>
        Предпочитаете &nbsp; 
        <input type="checkbox" name="choice[]" value="овощи">овощи &nbsp; 
        <input type="checkbox" name="choice[]" value="фрукты">фрукты<br><br>
        <button type="submit" name="submit">Отправить</button>
		<button type="reset" name="reset">Сбросить</button>
    </form>
</body>
</html>
HD;
 
//Если форма была уже отправлена, то в массиве уже есть элемент $_POST["submit"]
if(isset($_POST["submit"])){
	//Достаем полученные данные из суперглобального массива $_POST
	//и присваиваем их переменным для удобства использования
	$firstName = $_POST['firstName'];
	$lastName = $_POST['lastName'];
	
	//Проверяем, чтобы были введены символы в поля
	if(mb_strlen($firstName)<=1&&mb_strlen($lastName)<=1){
		//Прерываем скрипт
		echo 'Правильно заполните поля формы!';
		die();	
	}
	
	//Проверяем выбор пользователя 
	if(isset($_POST["choice"][0])){
		$user_choice_0=$_POST["choice"][0];
	}else{
		$user_choice_0='';
	}
	
	//Если выбраны оба пункта
	if(isset($_POST["choice"][0])&&isset($_POST["choice"][1])){
		$user_choice_1='и '.$_POST["choice"][1];
	//Если выбран один пункт
	}else if(isset($_POST["choice"][1])){
		$user_choice_1=$_POST["choice"][1];
	}else{
		$user_choice_1='';
	}
	
	//Если ничего не выбрано 
	if($user_choice_0==''&&$user_choice_1==''){
		$user_choice='отсутствуют';
	}else{
		$user_choice=$user_choice_0.' '.$user_choice_1;
	}

//Формируем строку вывода
$result=<<<HD
Имя: $firstName<br>
Фамилия: $lastName<br>
Предпочтения: $user_choice
HD;

	//Выводим результат
	echo $result;

}else{
	//Если же форма еще не была отправлена выводим ее
	echo $our_form;
}
?>

Решение задачи №2.3.3

Комментарии (0)

Петр Романовский
1. Приветствуются комментарии, которые содержат дополнения к материалу текущей страницы, а также ваши ответы на вопросы других пользователей.
2. Если вам что-то непонятно - спрашивайте, не забывая написать, что именно и с какого места.
Показаны все комментарии
Чтобы оставить свой комментарий, авторизуйтесь, пожалуйста!