В чем разница между PHP, включающими или требующими классы и необработанные письменные классы? - PullRequest
0 голосов
/ 27 декабря 2018

Я записал два класса в два разных файла, например, файл classA.php и classB.php, файл записан ниже.

файл classA.php

 class a {
      public function __construct() {
           require_once('classB.php');
           $classB = new b();
      }
 }
 $classA = new a();

файл classB.php

 class b {
      public function __construct() {
          echo "Hello World!";
      }
 }

И код работает нормально, а также выводит Hello World!. Но , когда я пишу оба класса следующим образом:

 class a {
     public function __construct() {
         class b {
             public function __construct() {
                 echo "Hello World!";
             }
         }

         $classB = new b();
     }
 }
 $classA = new a();

Показывает ошибку

Неустранимая ошибка: объявления классов не могут быть вложенными

Что Я думаю, что они оба должны делать одно и то же, вчера я нашел что-то о "произвольных местах", но я не нашел правильного ответа, что это такое.

Я просто хочу знать, почему оба они показывают разный результат?или, может быть, что-то о include или require, чего я не знал?

ПРИМЕЧАНИЕ

Я не спрашиваю, в чем разница между require() и include() функциями

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018
class a {
    public function __construct() {
         require_once('classB.php');
         $classB = new b();
    }
}
$classA = new a();

Не то же самое, что

class a {
    public function __construct() {
        class b {
            public function __construct() {
                echo "Hello World!";
            }
        }

        $classB = new b();
    }
}

Это также будет работать:

require_once('classB.php');
class a {
    public function __construct() {         
         $classB = new b();
    }
}
$classA = new a();

, если вы используете include() или require().Это означает, что вы можете использовать их свойства, такие как переменные, методы и т. Д.

Пример: у вас есть vars.php file

<?php
$color='red';
$car='BMW';
?>

THen Вы можете использовать $color и $car в htmlвот так:

<h1>Welcome to my home page!</h1>
  <?php include 'vars.php';
     echo "I have a $color $car.";
  ?>

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

0 голосов
/ 27 декабря 2018

Ваш ответ находится в документации PHP :

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

Таким образом, в отличие от переменных, не имеет значения, где находится строка require_once: класс всегда будет находиться в глобальной области видимости.

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

0 голосов
/ 27 декабря 2018

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

Вы можете определить несколько классов в одном файле, но не один классв коде другого класса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...