<MyRusakov.ru />

PHP и MySQL с Нуля до Гуру 2.0

PHP и MySQL с Нуля до Гуру 2.0

Данный курс научит Вас программировать на самом популярном Web-языке в мире - PHP. Курс состоит из 11 разделов, в которых с нуля рассказывается и показывается процесс написания различных скриптов на PHP.

В курсе Вы узнаете всю необходимую теоретическую часть, а также увидите массу практических примеров, в том числе, и из моей практики.

Почти к каждому уроку идут упражнения.

Просмотрев данный курс, Вы сможете создавать абсолютно любые PHP-сайты любой сложности.

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Форум сайта MyRusakov.ru

статические классы
06.09.2017 11:04:56 статические классы Сообщение #1
romas_s

romas_s

Новичок

Новичок

Дата регистрации:
05.09.2017 15:36:54

Сообщений: 2

Всем привет. Извините если создал тему не в нужном месте
Не могу разобраться со статическими классами.

Кто разобрался поделитесь плз опытом.
Где, как и почему применяется.
почему стоит использьзовать ИМЕННО статические классы в тех или иных случаях и т д.

я понимаю что такое статические переменные, но не могу вкурить статические функции и классы.

Как только не извращался, выдаетс сообщение что данный класс не может быть объявлен как статический и куча других непонятных мне ошибок.

Поделитесь плз рабочим примером статического класса со статическим под классом.
обычный класс со статическим под классом.

код который нужно было в уроке сделать статическим:
 и накидайте плз ссылок с полезной и доходчивой информацией по статическим классам.
index.php
<?php
/* Реализация с использованием статических методов
$_POST - переменная хранит данные отправленые методом POST
$_FILES - массив который хранит все характеристики отправленных файлов методом POST
require_once - подключает внешние файлы, в случает отсутствия файла - прекращается работа всех скриптов и выдается ошибка
*/
if ($_POST["upload"])
{
print_r($_FILES);

// подключаем классы
require_once("lib/uploadtext_class.php";
require_once("lib/uploadimage_class.php";


if ( $_POST["upload"] ) 
{
$upload_text = new UploadText();
//echo Upload::UploadText;
$upload_image = new UploadImage();
$success_text = $upload_text->uploadFile  ( $_FILES["text"] );
$success_image = $upload_image->uploadFile ( $_FILES["image"] );
}
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>OOP загрузка файлов</title>
</head>
<body>
<h1>Загрузка файлов</h1>
<?php
if ( $_POST["upload"] )
{
if ( $success_text ) echo "Текстовый файл супешно загружен" . "<br>";
else echo "Ошибка при загрузке текстового файла";
if ( $success_image ) echo "Картинка супешно загружена" . "<br>";
else echo "Ошибка при загрузке картинки";
}
?>
<form name = "myform" action = 'https://info.za500.biz/files/php/OOP_zaklu4enie_statik/index.php' method="post" enctype="multipart/form-data">
<table>
<tr>
<td>
Изображение:
</td>
<td>
<input type="file" name="image">
</td>
</tr>
<tr>
<td>
Файл:
</td>
<td>
<input type="file" name="text">
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="upload" value="Загрузить файлы">
</td>
</tr>
</table>
</form>
</body>
</html>

upload_class.php
<?php
/*
Реализация с использованием статических методов
abstract - создание абстрактного класса или функции
class - создание класса
protected - доступ в пределах класса и дочерних классов
public - открытый доступ
function - создание функции
$this-> - обращение к переменной в классе
move_uploaded_file (имя файла, куда загружать) - функция загрузки файлов
name
элемент массива (характеристик файла) который хранит имя загружаемого файла.
type
array - массив
foreach (массив as переменная счетчик) - цикл.
preg_match (регулярное выражение, массив) - проверка регулярного выражения
for - цикл
count - функция которая подсчитывает кол элементов массива
if - проверка условия
break - прервать цикл
size - размер файла в файтах
return - прерывание работы функции и возсрат значения
*/
 class Upload
{
protected $dir; // директория
protected $mime_types; // тип загружаемых аднных

/*функция проверки файла на расширение файла*/
protected function isSecurity ($file)
{
// запрещенные типы файлов
$blacklist = array(".php", ".phtml", ".php3", ".php4", ".html", ".htm";

// цикл, который проверяет, находится ли тип загружаемого нами файла в списке запрещенных файлов.
// если загружаемый тип файла запрещен - функция прекращает свою работу и возвращает false
// $item - произвольное название переменной, которая используется для перебора элементов массива $blacklist
foreach ($blacklist as $item) { if ( preg_match( "/$item\$/i", $file["name"] ) ) return false;  }

// получаем тип загружаемого файла, грубо говоря загружаемый файл рассматриваем как массив состоящий с атрибутов файла.
$type = $file ["type"];

// mime_types - масив со списком разрешенных типов файлов
// значение mime_types получаем с дочерних классов.
// count - функция которая подсчитывает кол элементов массива
for ( $i = 0; $i < count( $this->mime_types ); $i++ )
{
if ( $type == $this->mime_types[$i] ) break; // тип загружаемого файла соответствует разрешенным типам файлов
if ( $i +1 == count( $this->mime_types ) ) return false; // не нашли загружаемый тип файла в списке разрешенных, прерываем функцию и возвращаем false
}

$size = $file["size"]; 
if ($size > 2048000) return false; // проверка не превышает ли размер файла мах разрешенному размеру.
return true; // файл прошел проверку, разрешаем загрузку файла
}

// функция загрузки файлов на сервер
public function uploadFile ($file)
{
// проверяем соответствует ли файл требованим, если найдены не соответствия - прерываем работу функции и возвращаем false
if ( !$this->isSecurity ($file) ) return false;

// формируем полный путь загрузки файла с указанием имени файла
$uploadfile = $this->dir . "/" . $file["name"];
// move_uploaded_file - функция загрузки файлов
// tmp_name - элемент массива (характеристик файла) который хранит имя загружаемого файла.
return move_uploaded_file( $file["tmp_name"], $uploadfile );
}

}
?>
uploadimage_class.php
<?php
/*
require_once - подключаем файл с проверкой, что б файл не был подключен дважды
class - создаем класс
extends - наследование от родительского класса
protected - доступ к переменой только в пределах класса
array - массив
*/
require_once("upload_class.php";
class UploadImage extends Upload
{
protected $dir = "images";
protected $mime_types = array ( "image/png","image/jpeg","image/jpg","image/gif" );
}
?>

uploadtext_class.php

<?php
/*
require_once - подключаем файл с проверкой, что б файл не был подключен дважды
class - создаем класс
extends - наследование от родительского класса
protected - доступ к переменой только в пределах класса
array - массив
*/
require_once("upload_class.php";
class UploadText extends Upload
{
protected $dir = "text";
protected $mime_types = array("text/plain";
}
?>
Профиль Ответить
06.09.2017 18:59:42 статические классы Сообщение #2
Castels

Castels

Модератор

Модератор

Дата регистрации:
02.07.2013 20:44:09

Сообщений: 3

В PHP нет статических классов и тем более подклассов.
Статические поля и методы класса существуют без создания экземпляра класса, т.е. к ним можно получить доступ с помощью следующей нотации:
class MyClass
{
public static $name = "MyClass";

public static function getName() {
 // self - это синоним для MyClass
 return self::$name;
}
}


// статическая переменная
print MyClass::$name

// статический метод
print MyClass::getName()
Подробно написано здесь:

Готовимся к собеседованию по PHP: ключевое слово «static»
Профиль Ответить
06.09.2017 21:47:55 статические классы Сообщение #3
lll

lll

Эксперт

Эксперт

Дата регистрации:
17.06.2016 22:32:32

Сообщений: 120

Полностью согласен, с модератором выше! При статике не нужен экземпляр!
статические методы используются внутри класса или для настроек! Могу предложить для рассмотрения класс Route
Профиль Ответить
06.09.2017 21:48:47 статические классы Сообщение #4
lll

lll

Эксперт

Эксперт

Дата регистрации:
17.06.2016 22:32:32

Сообщений: 120

не понятно для чего Ваш код?
Профиль Ответить
07.09.2017 16:32:53 статические классы Сообщение #5
romas_s

romas_s

Новичок

Новичок

Дата регистрации:
05.09.2017 15:36:54

Сообщений: 2

Castels спасибо очень толковый мануал https://habrahabr.ru/post/259627
не успел еще изучить, но думаю, что найду там все ответы.

<<не понятно для чего Ваш код?>>

Курс - PHP и MySQL c нуля до гуру,

код для загрузки файлов и фото на хостинг.

данный скрипт разрабатывается по ходу изучения видео курса.
Домашнее задание - реализовать его через статику.
Загружать файлы используя классы, без создания объектов.

как создавать классы с использованием статических переменных - это изи и дураку понятно.

НО как вызвать статическую переменную / функцию в родительском классе
созданную в дочернем классе, увы никак не выходит.
У меня просто в голове не укладывается, статические переменные - не должны изменяться.
Но каким то образом нужно массив файла с фото газрузить в статическую переменную.
если загружать не в статичесвую переменную - значит нужно создавать объект класса.
А по задании - нужно вызвать класс без создания объекта класса.

Гуру PHP поделитесь плз рабочим примером реализации данного кода.

или может можно где то скачать решенное домашнее задание?? 
Профиль Ответить
12.09.2017 14:20:28 статические классы Сообщение #6
Castels

Castels

Модератор

Модератор

Дата регистрации:
02.07.2013 20:44:09

Сообщений: 3

[b]У меня просто в голове не укладывается, статические переменные - не должны изменяться

Статические пременные[/b] - это не константы, они могут изменяться.
Статическими же их называют потому, что они сохраняют свое значение  между вызовами. Вот пример:
<?php

function static_test()
{
static $prop = 0;
$prop++;
echo $prop, PHP_EOL;
}


static_test(); // 0
static_test(); // 1
static_test(); // 2
........................

?>
Статические переменные могут содержать только константы и константные выражения.
Т.е. это такие выражения, которые могут быть вычислены на этапы превращения скрипта в исполняемый код- на этапе компиляции. Поэтому, когда вы пытаетесь положить в статическую переменную массив, которые формируется динамически - ничего не выходит.

НО как вызвать статическую переменную / функцию в родительском классе
созданную в дочернем классе, увы никак не выходит.

Тестировал на PHP 7, все работает:
<?php

class ParentClass {
        
        public function __construct() {
            print Child::$name;
        }
    }

    
    class Child extends ParentClass {
        
        static $name = "Child";
    }
    
    

    $p = new ParentClass(); // выводит Child

?>

Запакуйте исходный код данного задания, если он есть, в архив и скиньте ссылку или пришлите текст задания как оно там написана.

А вообще, если что-то не получается, то лучше это что-то оставить на некоторое время и лишь потом вернуться к этому.
Профиль Ответить