Производительность перенесла бы автозагрузку использования в php и поиск файла класса?

Я предполагаю, что основной вопрос о переходе состояния в компонент во время тестирования.

1118 Вы можете сделать это? Да, но по-другому. Точно так же, как вы делаете в plain React, вы не можете создать компонент (это делает shallow(<...>)) проходное состояние. Здесь играют только реквизиты. Но есть метод .setState() , так что вы можете создать элемент и состояние прохождения следующей строки в:

const wrapper = shallow()
wrapper.setState(state);

Вам это нужно? Я верю, что нет. Я уверен, что вам нужно общаться с тестируемым компонентом точно так же, как вы работаете с ними в браузере:

  1. передавая различные реквизиты
  2. явно вызывая обратные вызовы реквизитов o0r ([113 ] действует так же, как wrapper.props().onClick({/*event mocked*/}))
  3. проверка render() результата

Почему так? 1. установка state напрямую ничего не говорит, если возможно получить такое состояние в дикой природе (скажем, вы можете пропустить, что свойство какого-то состояния используется в render, но никогда не изменяется ни одним из методов) 2. было бы сложнее сохраняйте актуальность тестов: наряду с любыми изменениями во внешнем интерфейсе компонентов (props) вам необходимо выровнять его внутренние компоненты (state) 3. и, наконец, будет легко перейти в противоречивое состояние, которого вы никогда не получите, взаимодействуя через props. ]

9
задан Community 23 May 2017 в 12:02
поделиться

7 ответов

__ автозагрузка является большой, но стоимость утверждения всех файлов в рекурсивной поисковой функции является дорогой. Вы могли бы хотеть посмотреть на создание дерева файлов для использования для автозагрузки. В моей платформе я последовательно называю файлы для их классов и использую карту, которая кэшируется для данных.

Проверьте http://trac.framewerk.org/cgi-bin/trac.fcgi/browser/trunk/index.php [битая ссылка], запускающаяся в строке 68 для идеи того, как это может быть сделано.

Править: И более непосредственно отвечать на Ваш вопрос, без кэширования, можно ожидать производительность, пораженную в сайт с носителем к интенсивному движению.

6
ответ дан 4 December 2019 в 15:30
поделиться

Общий шаблон (Груша, Платформа Зенда как примеры...) должен заставить имя класса отразить путь, таким образом, Db_Adapter_Mysql будет в в/Db/Adapter/Mysql.php, от где-нибудь это добавляется к включать-пути.

5
ответ дан 4 December 2019 в 15:30
поделиться

Существует 2 способа, которыми Вы могли легко сделать, это, в первую очередь, называет Ваши классы так, чтобы они определили структуру того, где найти их

function __autoload($classname)
{
    try
    {
        if (class_exists($classname, false) OR interface_exists($classname, false))
        {
            return;
        }

        $class = split('_', strtolower(strval($classname)));

        if (array_shift($class) != 'majyk')
        {
            throw new Exception('Autoloader tried to load a class that does not belong to us ( ' . $classname . ' )');
        }

        switch (count($class))
        {
            case 1: // Core Class - matches Majyk_Foo - include /core/class_foo.php
                $file = MAJYK_DIR . 'core/class_' . $class[0] . '.php';
            break;

            case 2: // Subclass - matches Majyk_Foo_Bar - includes /foo/class_bar.php
                $file = MAJYK_DIR . $class[0] . '/class_' . $class[1] . '.php';
            break;

            default:
                throw new Exception('Unknown Class Name ( ' . $classname .' )');
                return false;
        }

        if (file_exists($file))
        {
            require_once($file);

            if (!class_exists($classname, false) AND !interface_exists($classname, false))
            {
                throw new Exception('Class cannot be found ( ' . $classname . ' )');
            }
        }
        else
        {
            throw new Exception('Class File Cannot be found ( ' . str_replace(MAJYK_DIR, '', $file) . ' )');
        }

    }
    catch (Exception $e)
    {
        // spl_autoload($classname);
        echo $e->getMessage();
    }

}

Или, 2, используйте несколько автопогрузчиков. PHP> =5.1.2 Имеет библиотеку SPL, которая позволяет Вам добавлять несколько автопогрузчиков. Вы добавляете один для каждого пути, и он найдет его на, он - путь через. Или просто добавьте их к включать пути и используйте значение по умолчанию spl_autoload ()

Пример

function autoload_foo($classname)
{
    require_once('foo/' . $classname . '.php');
}

function autoload_bar($classname)
{
    require_once('bar/' . $classname . '.php');
}

spl_autoload_register('autoload_foo');
spl_autoload_register('autoload_bar');
spl_autoload_register('spl_autoload'); // Default SPL Autoloader
1
ответ дан 4 December 2019 в 15:30
поделиться

Автозагрузка является большой функцией PHP, которая помогает Вам очень... Производительность не пострадала бы, если будет использовать умную таксономию как: 1. каждая библиотека остается в папках "пакеты" 2. каждый класс расположен путем замены "_" в имени класса с "/" и добавления ".php" в классе конца = файл My_App_Smart_Object = packages/My/App/Smart/Object.php

Преимущества этого подхода (используемый почти любой платформой) являются также более умной организацией Вашего кода :-)

1
ответ дан 4 December 2019 в 15:30
поделиться

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

Реальный вопрос - какой из них более важен для Вас? Они - все компромиссы в конце, таким образом, необходимо выбрать тот. Спорно, тем не менее, что большинство издержек во вторых и третьих опциях имеет отношение к фактической компиляции кода. Используя что-то как APC может значительно уменьшить издержки загрузки и компиляции каждого класса на каждой загрузке страницы.

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

0
ответ дан 4 December 2019 в 15:30
поделиться

Я склонен использовать простой подход, где __ автозагрузка () консультируется с хешем, отображающим имена классов на относительные пути, который содержится в файле, это повторно создало использование простого сценария, который самого выполняет рекурсивный поиск.

Это требует, чтобы скрипт был запущен при добавлении нового файла класса или реструктуризации кодовой базы, но это также избегает "ума" в __ автозагрузка (), который может привести к ненужной статистике () вызовы, и это имеет преимущество, что я могу легко переместить файлы в своей кодовой базе, зная, что все, что я должен сделать, запущено единственный скрипт для обновления автопогрузчика.

Сам сценарий рекурсивно осматривает, мой включает / каталог и предполагает, что любой файл PHP, не названный в коротком списке исключений (сам автопогрузчик, плюс некоторые другие стандартные файлы я склонен иметь), содержит класс того же имени.

0
ответ дан 4 December 2019 в 15:30
поделиться

Подход Платформы зенда должен сделать автозагрузку на основе стандарта папки PEAR (Class_Foo отображается на/Class/Foo.php), однако вместо того, чтобы использовать основу набора соединяют каналом, это использует include_path.

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

Таким образом, небольшое отклонение должно вручную обеспечить массив основных путей, где автозагрузка может ожидать находить установку классов ГРУШЕВЫМ способом и просто циклом по основным путям:

<?php
//...
foreach( $paths as $path )
{
    if( file_exists($path . $classNameToFilePath) )
        include $path . $classNameToFilePath;
}
//...
?>

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

Но если Вы имеете необходимость все еще для рекурсивного сканирования каталогов, вопросом не является "Автозагрузка, повредит мою производительность", вопрос должен быть, "почему я бросаю свои файлы класса вокруг в случайной структуре?" Придерживание ГРУШЕВОЙ структуры сохранит Вас столько головных болей, и даже если Вы решаете пойти с ручным выполнением Вашего, включает в противоположность автозагрузке, не будет никакого предположения как, туда, где файлы класса расположены, когда Вы делаете Ваш включать операторы.

0
ответ дан 4 December 2019 в 15:30
поделиться
Другие вопросы по тегам:

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