Что такое stdClass в PHP?

Ограничения оператора in () являются корнем всего зла.

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

  • , если вы создаете оператор с переменным числом параметров, который будет обрабатывать служебные данные SQL для каждого вызова
  • на многих платформах, количество параметров of () ограничены
  • на всех платформах, общий размер текста SQL ограничен, что делает невозможным отправку 2000 заполнителей для параметров in
  • , отправляющих переменные связывания 1000- 10k невозможно, так как драйвер JDBC имеет свои ограничения

Подход in () может быть достаточно хорош для некоторых случаев, но не для защиты от ракеты:)

Ракетно-защитное решение состоит в том, чтобы передать произвольное количество параметров в отдельный вызов (например, путем передачи клока параметров), а затем иметь представление (или любой другой способ) для представления их в SQL и использовать в вашем месте критерии.

Вариант грубой силы здесь http://tkyte.blogspot.hu/2006/06/varying-in-lists.html

Однако, если вы можете использовать PL / SQL, этот беспорядок может стать довольно опрятным.

function getCustomers(in_customerIdList clob) return sys_refcursor is 
begin
    aux_in_list.parse(in_customerIdList);
    open res for
        select * 
        from   customer c,
               in_list v
        where  c.customer_id=v.token;
    return res;
end;

Затем вы можете передать произвольное количество идентификаторов клиентов, разделенных запятыми, в параметре и:

  • не будет получать задержку синтаксического анализа, так как SQL для select является стабильным
  • Отсутствие сложностей с конвейерными функциями - это всего лишь один запрос
  • , когда SQL использует простое соединение, вместо этого из оператора IN, который довольно быстр
  • в конце концов, это хорошее эмпирическое правило not , попадающее в базу данных с любым простым выбором или DML, поскольку это Oracle, который предлагает lightyears больше, чем MySQL или аналогичные простые двигатели баз данных. PL / SQL позволяет скрыть модель хранилища от вашей модели домена приложения эффективным способом.

Трюк здесь:

  • нам нужен звонок который принимает длинную строку и хранит где-нибудь, где сеанс db может получить к ней доступ (например, простая переменная пакета или dbms_session.set_context)
  • , тогда нам нужно представление, которое может анализировать это на строки
  • , а затем у вас есть представление, которое содержит идентификаторы, которые вы запрашиваете, поэтому все, что вам нужно, - это простое соединение с запрошенной таблицей.

Вид выглядит так:

create or replace view in_list
as
select
    trim( substr (txt,
          instr (txt, ',', 1, level  ) + 1,
          instr (txt, ',', 1, level+1)
             - instr (txt, ',', 1, level) -1 ) ) as token
    from (select ','||aux_in_list.getpayload||',' txt from dual)
connect by level <= length(aux_in_list.getpayload)-length(replace(aux_in_list.getpayload,',',''))+1

, где aux_in_list.getpayload ссылается на исходную строку ввода.


Возможным подходом было бы передать массивы pl / sql (поддерживаемые только Oracle), однако вы можете ' t использовать их в чистом SQL, поэтому шаг преобразования всегда необходим. Преобразование не может быть выполнено в SQL, поэтому, в конце концов, самым эффективным решением является передача clob со всеми параметрами в строке и преобразование его в представление.

988
задан random 14 February 2015 в 02:42
поделиться

3 ответа

stdClass - это общий пустой класс PHP, вроде как Object в Java или объект в Python ( Изменить: ], но фактически не используется в качестве универсального базового класса; спасибо @Ciaran за указание на это ).

Это полезно для анонимных объектов, динамических свойств и т. д.

Простой способ Считайте, что StdClass является альтернативой ассоциативному массиву. См. Пример ниже, в котором показано, как json_decode () позволяет получить экземпляр StdClass или ассоциативный массив. Также, но не показано в этом примере, SoapClient :: __ soapCall возвращает экземпляр StdClass.

<?php
//Example with StdClass
$json = '{ "foo": "bar", "number": 42 }';
$stdInstance = json_decode($json);
echo $stdInstance->foo . PHP_EOL; //"bar"
echo $stdInstance->number . PHP_EOL; //42
//Example with associative array
$array = json_decode($json, true);
echo $array['foo'] . PHP_EOL; //"bar"
echo $array['number'] . PHP_EOL; //42

См. Динамические свойства в PHP и StdClass для дополнительных примеров.

764
ответ дан 19 December 2019 в 20:20
поделиться

stdClass - это просто общий «пустой» класс, который используется при преобразовании других типов в объекты. Несмотря на то, что говорят два других ответа, stdClass - это , а не базовый класс для объектов в PHP. Это можно продемонстрировать довольно легко:

class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'

Я не верю, что в PHP есть концепция базового объекта

1101
ответ дан 19 December 2019 в 20:20
поделиться

Аналогично,

$myNewObj->setNewVar = 'newVal'; 

дает объект stdClass - автоматически приведенный

Я узнал это сегодня, написав с ошибкой:

$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';

Круто!

24
ответ дан 19 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: