Июн 232024
 

Основные операции с использованием ссылок в PHP

Ссылки в PHP позволяют нескольким переменным указывать на одно и то же значение. Вот основные операции, которые можно выполнять с использованием ссылок:

  • 1. Присваивание по ссылке:
$a = 5;
$b = &$a;  // $b ссылается на $a
  • 2. Передача параметров по ссылке в функции:
function addFive(&$num) {
    $num += 5;
}

$value = 10;
addFive($value);
echo $value;  // Выводит 15
  • 3. Возврат значения по ссылке из функции:
function &getValue() {
    static $value = 100;
    return $value;
}

$myValue = &getValue();
$myValue = 200;
echo getValue();  // Выводит 200
  • 4. Использование ссылок для элементов массивов:
$arr = [1, 2, 3];
$ref = &$arr[1];
$ref = 20;
echo $arr[1];  // Выводит 20

Основные операции с переменными типа Object в PHP

Объекты в PHP всегда передаются по ссылке. Основные операции с объектами включают:

  • 1. Создание объекта:
class MyClass {
    public $value = 10;
}

$obj1 = new MyClass();
  • 2. Присваивание объекта другой переменной:
$obj2 = $obj1;
  • 3. Изменение свойств объекта:
$obj2->value = 20;
echo $obj1->value;  // Выводит 20
  • 4. Передача объекта в функции:
function modifyObject($obj) {
    $obj->value = 30;
}

modifyObject($obj1);
echo $obj1->value;  // Выводит 30
  • 5. Сравнение объектов:
$obj1 = new MyClass();
$obj2 = new MyClass();
$obj3 = $obj1;

var_dump($obj1 == $obj2);  // true, если свойства и значения одинаковы
var_dump($obj1 === $obj2); // false, разные объекты
var_dump($obj1 === $obj3); // true, тот же объект

Основные операции с переменными типа Array в PHP

Массивы в PHP передаются по значению, но можно передавать их по ссылке. Основные операции с массивами включают:

  • 1. Создание массива:
$array = [1, 2, 3];

 

  • 2. Присваивание массива другой переменной:
$array2 = $array;

 

  • 3. Изменение элементов массива:
$array2[0] = 10;
echo $array[0];  // Выводит 1

 

  • 4. Передача массива в функции по значению:
function modifyArray($arr) {
    $arr[0] = 20;
}

modifyArray($array);
echo $array[0];  // Выводит 1

 

  • 5. Передача массива в функции по ссылке:
function modifyArrayByReference(&$arr) {
    $arr[0] = 20;
}

modifyArrayByReference($array);
echo $array[0];  // Выводит 20

 

  • 6. Слияние массивов:
$array1 = [1, 2, 3];
$array2 = [4, 5, 6];
$merged = array_merge($array1, $array2);
или
$merged = $array1 + $array2;

 

  • 7. Поиск в массиве:
$array = [1, 2, 3, 4, 5];
$key = array_search(3, $array);

 

  • 8. Удаление элемента из массива:
unset($array[1]);  // Удаляет второй элемент

Эти операции покрывают основные аспекты работы с ссылками, объектами и массивами в PHP, позволяя эффективно использовать их в различных сценариях.

Июн 232024
 

В PHP ссылка (reference) — это способ доступа к содержимому переменной через другую переменную. Когда создается ссылка на переменную, обе переменные указывают на одно и то же содержимое. Это означает, что изменение значения одной переменной отразится и на другой.

 

Создание ссылки

Для создания ссылки в PHP используется символ &. Например:

$a = 5;
$b = &$a; // $b ссылается на $a

$b = 10;
echo $a; // Выводит 10, так как $a и $b ссылаются на одно и то же содержимое

Применение ссылок

Ссылки могут быть полезны в различных сценариях:

1) Передача параметров по ссылке: При передаче параметра функции по ссылке, функция может изменять значение аргумента, переданного ей.

function addFive(&$num) {
    $num += 5;
}

$original = 10;
addFive($original);
echo $original;  // Выводит 15

2) Возврат ссылки из функции: Функция может возвращать ссылку, что позволяет напрямую изменять значение переменной, полученной из функции.

function &getValue() {
    static $value = 100;
    return $value;
}

$myValue = &getValue();
$myValue = 200;

echo getValue();  // Выводит 200

Как передаются переменные типа Object

 

В PHP, начиная с версии 5, объекты всегда передаются по ссылке. Это означает, что при присваивании объекта другой переменной или передаче его функции, обе переменные будут ссылаться на один и тот же объект.

 

class MyClass {
    public $value = 10;
}

$obj1 = new MyClass();
$obj2 = $obj1;

$obj2->value = 20;
echo $obj1->value;  // Выводит 20, так как $obj1 и $obj2 ссылаются на один и тот же объект

Как передаются переменные типа Array

Массивы в PHP передаются по значению. Это означает, что при присваивании массива другой переменной или передаче его функции создается копия массива. Изменения, внесенные в копию, не повлияют на оригинальный массив. Однако, начиная с PHP 5.4, если массив не модифицируется, копия не создается сразу, а используется оптимизация копирования при записи (copy-on-write).

Пример передачи массивов

$array1 = [1, 2, 3];
$array2 = $array1;

$array2[0] = 10;
echo $array1[0];  // Выводит 1, так как $array2 является копией $array1

Пример передачи массивов по ссылке

Если нужно передать массив по ссылке, это делается явно с помощью оператора &.

$array1 = [1, 2, 3];
$array2 = &$array1;

$array2[0] = 10;
echo $array1[0];  // Выводит 10, так как $array2 ссылается на $array1

Важно помнить

— Ссылки в PHP не являются указателями, как в языках C/C++. Они просто позволяют двум переменным указывать на одно и то же значение.

— Ссылки не могут быть использованы с неинициализированными переменными.

— Ссылки не работают с переменными, содержащими объекты (начиная с PHP 5, объекты всегда передаются по ссылке).

Итоги

  • Ссылки позволяют двум переменным указывать на одно и то же значение, изменения одной переменной отражаются на другой.
  • Объекты в PHP передаются по ссылке по умолчанию, независимо от того, присваиваются ли они другой переменной или передаются в функцию.
  • Массивы передаются по значению, что означает создание копии, но с оптимизацией копирования при записи в PHP 5.4 и выше.

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

Авг 192014
 

Потратил на чтение документации достаточно времени, заставляя Samba работать с символическими ссылками. Предлагаю Вам свое решение.

Открываем конфигурационный файл:

sudo nano /etc/samba/smb.conf

В начале секции [global] пишем.

unix extensions = no
wide links = yes
follow symlinks = yes

Не забываем перезагрузить демон:

service smbd restart
/etc/init.d/samba restart

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

Июл 162014
 

Решение проблемы с обрезанными массивами в PHP

 

Решил написать сегодня небольшую, но очень важную статью об параметрах которые находятся в PHP:

post_max_size = 512M

Максимально допустимый размер данных, отправляемых через методом POST. Этот параметр влияет на объем передаваемых данных методом POST, так же важно учитывать его при реализации загрузки файлов через скрипты, в частности на размер файла эта директива и влияет. По умолчанию данный параметр стоит 8Мб.

post_max_vars = 2000

Если про post_max_size все хорошо описано в мануале и он есть по умолчанию в конфигурации php, то про параметр post_max_vars глухая тишина. Так что же это такой за параметр. Post_max_vars указывает интерпретатору сколько будет обрабатываться строк в POST запросе, ограничение стоит по умолчанию 200 строк.
Для крупных проектов, особенно реализованных на таких тяжеловесах как Битрикс это довольно мало.
Поэтому, если вы столкнулись с проблемой, когда при сохранении данных вы получается обрезанный POST массив или массив в котором только часть передаваемых строк, значит вам нужно не искать ошибку в вашем скрипте, а менять параметры на сервере. Если такой возможности нет, значит надо переделывать скрипт так, что бы он не превышал лимитов.

max_input_vars = 2000

Сколько входных переменных может быть принято в одном запросе (ограничение накладывается на каждую из глобальных переменных $_GET, $_POST и $_COOKIE отдельно). Использование этой директивы снижает вероятность сбоев в случае атак с использованием хеш-коллизий. Если входных переменных больше, чем задано директивой, выбрасывается предупреждение E_WARNING, и все последующие переменные в запросе игнорируются. Это ограничение применяется к каждому уровню вложенности входного многомерного массива.
Ограничение стоит по умолчанию 200 строк.

Поменяем в php.ini.
Параметр post_max_size уже там указан, и достаточно найти его поиском и поменять, тогда как post_max_vars придется дописать, например под post_max_size, с max_input_vars мы поступим таким же образом.

Июн 062014
 

Исправляем ошибку 413 Request Entity Too Large

Ошибка появляется когда объем файла превышает допустимый размер. Одна из основных причин — это настройки по умолчанию nginx, а именно параметра client_max_body_size, который по умолчанию равен 1m.

Директива client_max_body_size задаёт максимально допустимый размер
тела запроса клиента, указываемый в строке "Content-Length" в
заголовке запроса. Если размер больше заданного,
то клиенту возвращается ошибка "Request Entity Too Large" (413).
Следует иметь в виду, что браузеры не умеют корректно показывать
эту ошибку.

Решение
В конфигурационном файле nginx.conf, добавить директиву если нет client_max_body_size или увеличить значение:

Пример:

client_max_body_size 512M