- what does INCLUDE_CHECK do in php?
- PHP define scope for included file
- 7 Answers 7
- Полезные мелочи программирования на PHP
- Функциональность
- Скорость
- Вывод
- Постройка текста для вывода
- Выясняем отношения с кавычками
- Точка или запятая?
- heredoc?
- Конец строки
- Смысл ?>
- require, include, readfile
- readfile
- include и require
- . _once?
what does INCLUDE_CHECK do in php?
This is a constant that is being used by that application later. Define() is used to create these constants. Typically this is used for configuration data. To use this constant later, you simply use the string INCLUDE_CHECK in code like it were a variable without the $.
They can be. They can hold any non-complex data structure. String, float, int, bool. They can’t hold objects or arrays. If you are really very new to PHP, I would just read php.net’s entry on Define() and if that is too hard to understand, come back to it later. This is a moderate-advanced aspect of PHP.
I am selecting it but it says will be selected after 2 mins. Thanks again and I will select this ans.
Just an addition to DampeS8N Answer which is correct one.
I read php.net’s link http://in2.php.net/manual/en/function.define.php and below example makes it clear that any value can be used inside define function for defining variable as constant and INCLUDE_CHECK was just a variable which I thought as some kind of php feature 😉
@DampeS8N pls. comment if wrong!
Thanks to all of you for your answers!
INCLUDE_CHECK is not a feature of PHP itself, only of some code that someone has written in PHP. The first hit on google shows us a configuration file that a user is attempting to protect by checking if the variable is defined.
The approach taken in the sniped I found on google is like this
- a file which can be referenced directly (e.g. http://example.com/foo.php) will define INCLUDE_CHECK and then include a file that checks INCLUDE_CHECK, e.g. config.php; because foo.php has already defined it, this will work correctly
- if a user accesses config.php directly (e.g. http://example.com/config.php) then INCLUDE_CHECK will not have been defined, so an error will occur, preventing the user from running the script.
The following examples should make this clearer
If a user accesses config.php directly, then INCLUDE_CHECK is not defined, so the script will die with the message invalid access. If a user accesses foo.php, it will define INCLUDE_CHECK then include config.php, which will then echo Hello World.
This is a pretty crap way of protecting a configuration file, btw; see my post here for a more simple and reliable approach.
PHP define scope for included file
I have quite a lot of PHP view files, which I used to include in my controllers using simple include statements. They all use methods declared in a view class which they get like $view->method(); However I recently decided that it would be better if the including would also be done by this view class. This however changes the scope of the included file so that $view is no longer defined. Here is a code example:
in someViewFile.php (BOTH siuations) etc. OLD SITUATION in controller: $view = new view; include('someViewFile.php'); //$view is defined in someViewFile.php NEW SITUATION in controller: $view = new view; $view->show('someViewFile'); //$view is not defined in someViewFile.php
Is there anyway to declare the scope of the inluded file or is this the best way of solving the problem? These examples are off coarse simplified.
7 Answers 7
Here’ a simplified but functional view class that I’ve seen around quite a lot and use quite a lot.
As you can see in the code below: you instantiate a view with the filename of the template file.
The client code, probably a controller, can send data into the view. This data can be of any type you need even other views.
Nested views will be automatically rendered when the parent is rendered.
Hope this helps.
// simple view class class View < protected $filename; protected $data; function __construct( $filename ) < $this->filename = $filename; > function escape( $str ) < return htmlspecialchars( $str ); //for example >function __get( $name ) < if( isset( $this->data[$name] ) ) < return $this->data[$name]; > return false; > function __set( $name, $value ) < $this->data[$name] = $value; > function render( $print = false ) < ob_start(); include( $this->filename ); $rendered = ob_get_clean(); if( $print ) < echo $rendered; return; >return $rendered; > function __toString() < return $this->render(); > >
// usage $view = new View( 'template.phtml' ); $view->title = 'My Title'; $view->text = 'Some text'; $nav = new View( 'nav.phtml' ); $nav->links = array( 'http://www.google.com' => 'Google', 'http://www.yahoo.com' => 'Yahoo' ); $view->nav = $nav; echo $view;
//template.phtml nav ?> escape( $this->text ) ?> //nav.phtml links as $url => $link ): ?> ">
Полезные мелочи программирования на PHP
Язык программирования PHP очень и очень свободный. Из-за этого, к сожалению, есть много способов написать тоже самое и не знать, что можно лучше. В этом топике я опишу несколько мелочей, полезных начинающим и немного продвинутым PHP программистам.
Функциональность
php.net предлагает небольшую статейку о разнице между ними, но она не очень информативна
Функциональная разница между ними только та, что
($success) ? echo 'Ура!': echo 'Увы. ';
Разница не в счёт, поэтому будем говорить о них как об одинаковых конструктах.
Скорость
ничего не возвращает и поэтому чуть-чуть быстрее. Разница в парсинге смешная, но вот что интереснее: «echo» — четыре буквы, лежащие очень удобно под рукой, а «print» — пять, и чуть похуже расположенных.
В скорости
Вывод
Можно много говорить о том, что разница в скорости очень мизерная, но если разницы в функциональности никакой, то зачем использовать
Постройка текста для вывода
Выясняем отношения с кавычками
). Разница между ними очень большая.
В простых кавычках парсер ищет только простую кавычку (как символ конца) и обратный слэш (для ввода простой кавычки). В двойных же парсер умеет многое другое. Например — видеть переменные (
).
Очевидно, что простые кавычки побыстрее, парсеру почти не надо думать. Но самое главное — это читабельность кода. Конструкции в двойных кавычках не только тяжелее воспринимать взглядом, многие редакторы с подсветкой кода их не могут разглядеть (разумеется, такие монстры, как ZDE справляются с этим без проблем, но ведь человек, редактирующий код после Вас может его и не иметь).
Точка или запятая?
В первом случае мы передаём два параметра, во втором один: склееный оператором склейки. Используя точку мы заставляем парсер на время всё схватить в память и склеить, как указывает Wouter Demuynck, поэтому запятые оказываются побыстрее (разумеется, проверено тестами).
heredoc?
В PHP есть конструкция «HEREDOC». Выглядит она так:
echo Hello,
world,
I love you!
HEREDOC;
Здесь вместо «HEREDOC» может быть что угодно.
Правда, знать про эту конструкцию нужно только то, что она в десять раз медленее своих коллег, не очень читабельна и поэтому её лучше не использовать.
Конец строки
define('N',PHP_EOL); echo 'foo' . N;
но это сугубо моё мнение и здесь я не уверен.
Смысл ?>
Мало кто знает, что ставить эту конструкцию в конец файла не надо. Мало того, гораздо лучше, когда его там нет, тогда нету опасности, что там проскочит пробел и разрушит далее посылаемые
functions.php:
function foo()
.
>
function bar()
.
>
require, include, readfile
readfile
просто выбрасывает содержимое файла в output. Если вам надо показать меню или баннер, то эта функция — как раз.
include и require
же относится к ошибке спокойно и просто даёт warning, не прерывая выполнения. Вывод — require нужна гораздо чаще.
. _once?
include_once; require_once
В таком случае парсер проверит, может он уже эти файлы добавил? Удобно для подключения библиотек в больших проектах. Можно не боясь добавлять
в каждый модуль, где нужна библиотека.
Запись в файл
file_put_contents('filename','data');
// File put contents if (!defined('FILE_APPEND')) define('FILE_APPEND',1); if (!function_exists('file_put_contents')) < function file_put_contents($n, $d, $flag = false) < $mode = ($flag == FILE_APPEND || strtoupper($flag) == 'FILE_APPEND') ? 'a' : 'w'; $f = @fopen($n, $mode); if ($f === false) < return 0; >else < if (is_array($d)) $d = implode($d); $bytes_written = fwrite($f, $d); fclose($f); return $bytes_written; >> >