Уведомление: попытка получить доступ к смещению массива по значению типа bool в строке 83

#php #wordpress

#php #wordpress

Вопрос:

Только что заметил это после включения режима отладки в Php 7.4. Есть несколько вопросов, связанных с этим, но ни один из них не получил положительного ответа. Хотелось бы получить достойный ответ для тех, кто также столкнется с той же проблемой в 7.4 WP

Эти строки читаются:

    // Get image size after cropping.
            $dims = image_resize_dimensions( $orig_w, $orig_h, $width, $height, $crop );
            $dst_w = $dims[4];
            $dst_h = $dims[5];

            // Return the original image only if it exactly fits the needed measures.
            if ( ! $dims amp;amp; ( ( ( null === $height amp;amp; $orig_w == $width ) xor ( null === $width amp;amp; $orig_h == $height ) ) xor ( $height == $orig_h amp;amp; $width == $orig_w ) ) ) {
                $img_url = $url;
                $dst_w = $orig_w;
                $dst_h = $orig_h;
            } else {
                // Use this to check if cropped image already exists, so we can return that instead.
                $suffix = "{$dst_w}x{$dst_h}";
                $dst_rel_path = str_replace( '.' . $ext, '', $rel_path );
                $destfilename = "{$upload_dir}{$dst_rel_path}-{$suffix}.{$ext}";

                if ( ! $dims || ( true == $crop amp;amp; false == $upscale amp;amp; ( $dst_w < $width || $dst_h < $height ) ) ) {
                    // Can't resize, so return false saying that the action to do could not be processed as planned.
                    return false;
                }
                // Else check if cache exists.
                elseif ( file_exists( $destfilename ) amp;amp; getimagesize( $destfilename ) ) {
                    $img_url = "{$upload_url}{$dst_rel_path}-{$suffix}.{$ext}";
                }
                // Else, we resize the image and return the new resized image url.
                else {

                    $editor = wp_get_image_editor( $img_path );

                    if ( is_wp_error( $editor ) || is_wp_error( $editor->resize( $width, $height, $crop ) ) )
                        return false;

                    $resized_file = $editor->save();

                    if ( ! is_wp_error( $resized_file ) ) {
                        $resized_rel_path = str_replace( $upload_dir, '', $resized_file['path'] );
                        $img_url = $upload_url . $resized_rel_path;
                    } else {
                        return false;
                    }

                }
            }
  

Разрешенный код выглядит следующим образом: — Как упоминалось в комментарии к утвержденному ответу, декларации $ dst_w amp; dst_h были помещены в оператор else .

  // Get image size after cropping.
            $dims = image_resize_dimensions( $orig_w, $orig_h, $width, $height, $crop );

            // Return the original image only if it exactly fits the needed measures.
            if ( ! $dims amp;amp; ( ( ( null === $height amp;amp; $orig_w == $width ) xor ( null === $width amp;amp; $orig_h == $height ) ) xor ( $height == $orig_h amp;amp; $width == $orig_w ) ) ) {
                $img_url = $url;
                $dst_w = $orig_w;
                $dst_h = $orig_h;
            } else {
                // Use this to check if cropped image already exists, so we can return that instead.
                $suffix = "{$dst_w}x{$dst_h}";
                $dst_rel_path = str_replace( '.' . $ext, '', $rel_path );
                $destfilename = "{$upload_dir}{$dst_rel_path}-{$suffix}.{$ext}";
            $dst_w = $dims[4];
            $dst_h = $dims[5];

                if ( ! $dims || ( true == $crop amp;amp; false == $upscale amp;amp; ( $dst_w < $width || $dst_h < $height ) ) ) {
                    // Can't resize, so return false saying that the action to do could not be processed as planned.
                    return false;
                }
                // Else check if cache exists.
                elseif ( file_exists( $destfilename ) amp;amp; getimagesize( $destfilename ) ) {
                    $img_url = "{$upload_url}{$dst_rel_path}-{$suffix}.{$ext}";
                }
                // Else, we resize the image and return the new resized image url.
                else {

                    $editor = wp_get_image_editor( $img_path );

                    if ( is_wp_error( $editor ) || is_wp_error( $editor->resize( $width, $height, $crop ) ) )
                        return false;

                    $resized_file = $editor->save();

                    if ( ! is_wp_error( $resized_file ) ) {
                        $resized_rel_path = str_replace( $upload_dir, '', $resized_file['path'] );
                        $img_url = $upload_url . $resized_rel_path;
                    } else {
                        return false;
                    }

                }
            }
  

Ответ №1:

Уведомление означает, что $dims — это не массив, а логическое значение, вероятно, потому, что image_resize_dimensions завершается ошибкой и возвращает false .

image_resize_dimensions возвращает false, если

  • исходный размер равен 0 или меньше
  • оба назначения with и height равны 0 / не указаны
  • исходный размер равен целевому размеру (в этом случае изображение не нужно изменять)

Вы должны проверить, что значение $dims не равно false, прежде чем пытаться получить доступ к $dims[4] и $ dims[5] .

Комментарии:

1. Это то, о чем я думал. Но тогда это будет означать, что разрешение требует от меня изменения всех местоположений, в которых вызывается $ dims ? Или есть разрешение, которое мы можем вставить прямо здесь? Кроме того, как 7.4 вызвал это уведомление, поскольку оно бездействовало во всех предыдущих версиях

2. Я бы предположил, что предупреждения просто не регистрировались ранее. Ваш код работает нормально. Ваш оператор if проверяет, если! $ dims ($ dims === false) и просто использует исходный размер в качестве целевого размера. Вам просто нужно переместить $ dst_w = $dims[4]; $ dst_h = $dims[5]; часть внутри тела else, чтобы она не выполнялась, если $ dims не является массивом.

3. Я также предполагаю, что я переборщил с анализом. Это было скорее любопытство, и я видел другие оставшиеся без ответа вопросы по этому поводу; так что спасибо!