Действительно, окончательная версия C ++ 11 не позволяет использовать списки инициализаций с правой стороны (или, если угодно, с левой стороны) двоичного оператора.
Во-первых, , списки инициализаторов не являются выражениями, как определено в § 5 Стандарта. Аргументы функций, а также бинарных операторов обычно должны быть выражениями, а грамматика для выражений, определенных в § 5, не включает синтаксис для списков бит-init (т.е. чистых списков инициализаторов; обратите внимание, что имя_файла , за которым следует список команд, например, bar {2,5,"hello",7}
, является выражением.)
Для того, чтобы удобно использовать чистые списки инициализаторов, стандарт определяет различные исключения, которые суммируются в следующей (ненормативной) заметке:
§8.5.4 / 1 [...] Примечание: Инициализация списка может использоваться как инициализатор в определении переменной (8.5) - как инициализатор в новом выражении (5.3.4) - в операторе return (6.6.3) - в качестве аргумента функции (5.2.2) - в качестве индекса (5.2.1) - в качестве аргумента для вызова конструктора (8.5, 5.2.3) - в качестве инициализатора для нестатического элемента данных (9.2) - в mem-инициализаторе (12.6.2) - справа - (5.17) [...]
Четвертый пункт выше явно разрешает чистые инициализационные списки как аргументы функции (поэтому работает
operator<<(baz, {1, -2, "foo", 4, 5});
), пятый - в выражении в нижнем индексе (т. как аргументoperator[]
, например.mymap[{2,5,"hello"}]
является законным), а последний элемент разрешает их в правой части присвоений (но не общих двоичных операторов).Не существует такого исключения для двоичных таких как
+
,*
или<<
, поэтому вы не можете поместить чистый список инициализаторов (то есть тот, которому не предшествует имя типа) по обе стороны от них.Что касается причины этого, черновик / дискуссионный документ N2215 от Stroustrup и Dos Reis с 2007 года дают много информации о многих проблемах с списками инициализаторов в различных контекстах. В частности, существует раздел о бинарных операторах (раздел 6.2):
Рассмотрим более общее использование списков инициализаторов. Например:
v = v+{3,4}; v = {6,7}+v;
Когда мы рассматриваем операторы как синтаксический сахар для функций, мы, естественно, рассмотрим вышеупомянутый эквивалент
v = operator+(v,{3,4}); v = operator+({6,7},v);
. Поэтому естественно расширить использование инициализатора списки в выражения. Существует много применений, когда списки инициализаторов в сочетании с операторами являются «естественными» обозначениями. Однако нетривиально написать грамматику LR (1), которая позволяет произвольно использовать списки инициализаторов. Блок также начинается с {, поэтому включение списка инициализаторов в качестве первого (самого левого) объекта выражения приведет к хаосу в грамматике. Тривиально разрешить списки инициализаторов в качестве правого операнда двоичных операторов, индексов и аналогичных изолированных частей грамматики. Реальная проблема заключается в том, чтобы разрешить
;a={1,2}+b;
как оператор присваивания без разрешения;{1,2}+b;
. Мы подозреваем, что разрешить списки инициализаторов как правые, но и [sic] как левые аргументы большинству операторов - это слишком много kludge, [...]Другими словами , списки инициализаций не включены в правой части , поскольку они не включены с левой стороны , и они не включены с левой стороны, потому что это могло бы стать слишком большим проблема для парсеров.
Интересно, можно ли упростить эту проблему, выбрав другой символ вместо фигурных скобок для синтаксиса списка инициализаторов.
Похоже, что что-то не так с вашей конфигурацией, вот несколько вещей, которые вы можете проверить:
php -v
из командной строки и посмотреть, возвращает ли информация о версии или какие-либо ошибки. LoadModule php5_module "c:/php/php5apache2_2.dll"
в файле. Найдите LoadModule php
и убедитесь, что перед ним нет комментария (;
). AddType application/x-httpd-php .php
. Это говорит Apache, чтобы запустить .php
файлы как PHP. Найдите AddType, а затем убедитесь, что есть запись для PHP, и что она раскоментирована. .php
на нем или любое расширение, указанное в определении MIME в point # 3, иначе он не будет выполняться как PHP. <?
), это не включен на всех серверах по умолчанию, и их использование не рекомендуется. Вместо этого используйте <?php
(или включить короткие теги в вашем php.ini с short_open_tag=On
, если у вас есть код, который их использует). http://localhost/file.php
, не через доступ к локальному файлу file://localhost/www/file.php
И, наконец, проверьте Руководство по PHP для дальнейших советов по настройке .
Я столкнулся с этой проблемой на php 7.1, который поставляется с High Sierra (OS X 10.13.5), редактирование /etc/apache2/httpd.conf
со следующими изменениями помогло:
LoadModule php7_module libexec/apache2/libphp7.so
<IfModule php7_module>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
</IfModule>
У меня был случай, когда я случайно начал разворачивать каталог файлов в корне. Он добавил файл .htaccess из моей папки с файлами, который блокирует все php
# If we know how to do it safely, disable the PHP engine entirely.
<IfModule mod_php5.c>
php_flag engine off
</IfModule>
. Нижняя строка проверяет файл .htaccess на root.
Я нашел еще одну проблему, вызвавшую эту проблему, и уже решил ее. Я случайно сохранил свой скрипт в кодировке UTF-16
. Похоже, что PHP5 не может распознать тег <?php
в 16-битной кодировке по умолчанию.
Добавить AddType application/x-httpd-php .php
в файл httpd.conf, если вы используете Apache 2.4
Для меня работала переустановка модуля mcrypt
.
$sudo apt-get install php5-mcrypt
$sudo php5enmod mcrypt
Убедитесь, что сценарий содержит
<?php
перед кодом, который должен быть выполнен. Между <?
и php
в этом не должно быть пробелов.
Я решил это, удалив XAMPP и установив WAMP. Спасибо за помощь.
note для пользователей php 7, добавьте это в свой файл httpd.conf:
# PHP 7 specific configuration
<IfModule php7_module>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
</IfModule>
httpd.conf
находится в /etc/apache2/httpd.conf
. Если вы используете Ubuntu, это будет apache2.conf
в том же каталоге, который необходимо изменить для PHP7.
– Ahmed Sagarwala
14 August 2018 в 19:07
Для новой настройки LAMP running php 7 отредактируйте файл /etc/httpd/conf/httpd.conf. Примечание. Обязательно сделайте резервную копию для него перед тем, как что-либо изменить.
Вставьте это в самое нижнее файла:
<IfModule php7_module>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
Затем найдите LoadModule и вставьте следующую строку:
LoadModule php7_module modules/libphp7.so
Эта строка просто попросит httpd загрузить модуль php 7
Затем перезапустите httpd
Я запускаю Apache на Ubuntu, и моя проблема в том, что файл /etc/apache2/mods-available/php5.conf
отсутствовал:
<FilesMatch ".+\.ph(p[345]?|t|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
Я добавил его обратно, а php правильно обрабатывал файлы php.
О Боже! Я только что видел ваше опубликованное изображение снова, вы просто открываете свой php-файл в браузере. у вас есть open, использующий localhost url. если вы открываете файл непосредственно из своего каталога, он не будет выполнять php-код в любом случае.
use: http://locahost/index.php
или http:127.0.0.1/index.php
включить php-код в вашем случае , вы используете <?
, который является коротким кодом php для <?php
, по умолчанию короткие короткие коды php отключены.
также используют: sudo apt-get install php5 libapache2-mod-php5 php5-mcrypt
, если вы являетесь пользователем ubuntu .
Я отправляю этот ответ, потому что мой интерфейс администратора Virtualmin / Webmin решил, что было бы неплохо отключить мой PHP-движок. Я нашел время, чтобы найти решение, поэтому я решил поделиться с ним вы, ребята:
Также не забудьте проверить, что ни один из ваших конфигурационных файлов вашего сайта, связанных с этим конкретным хостом или виртуальным хостом, не имеет в них php_admin_value, которые отключают PHP, например:
php_admin_value engine Off
В случае сомнений прокомментируйте это ...
# php_admin_value engine Off
И перезагрузите свой веб-сервер.
/etc/apache2/mods-enabled/php7.conf
или php5.conf
– LXXIII
20 October 2016 в 22:53
sudo grep php_admin_value /etc/* -R
– Henry van Megen
23 May 2018 в 11:05
Это было в моем .htaccess
DirectoryIndex index.html index.htm
index.html, содержащем PHP-код. По умолчанию PHP не будет обрабатывать файлы с такими расширениями, как htm *, как PHP-код.
Вы можете переопределить это, добавив следующее в .htaccess:
<FilesMatch ".+\.html$">
SetHandler application/x-httpd-php
</FilesMatch>
Проверьте все пакеты, которые вы установили для php, используя:
yum list installed | grep remi
Установите все соответствующие пакеты php, особенно php-devel на вашем компьютере.
Я думаю, что проблема в том, что он показывает код вместо результата, так это то, что он не будет на локальном хосте. перепроверьте, какой адрес ур собирается. И отправляемся в локальный каталог файлов или на локальный хост.
из скриншота u отправил его на ур компьютер не на localhost.
"file: ///" это должен быть "localhost /"
Это произошло со мной снова, вместе с сервером, загружающим html-файлы, а не обработкой. Я не использовал веб-сервер Apache некоторое время на компьютере, а между тем Ubuntu обновлялся как еще две версии изначально установленных LTS. Теперь это
$ cat /etc/issue
Ubuntu 16.04 LTS
Итак, php работал так:
$ sudo apt-get install lamp-server^
$ sudo a2enmod php7.0
$ sudo service apache2 restart
Теперь веб-сервер разбирал php. Возможно, теперь вам нужно обновить некоторые веб-страницы, так как теперь php7.0 работает там, где это было до запуска php5. О, хорошо.
У меня была аналогичная проблема, но в моем случае решение было другим. мой файл, который содержал php-код, назывался «somename.html», изменил его на «somename.php», работал отлично
на моем ubuntu 14.04, apache 2.4, php 5.5.9 install, я попробовал с sample.php on / var / www / html (root по умолчанию), и он работал нормально. Таким образом, проблема была в моей конфигурации виртуальных серверов. Решение заключалось в том, чтобы включить в директорию def, содержащую .php, следующую строку:
php_admin_flag engine on
php7:
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php7.0-fpm
sudo service apache2 restart
sudo a2enmod proxy_fcgi setenvif
создает три новые моды /mods-available/proxy.conf proxy_fcgi.load proxy.load
Аналогично, sudo a2enconf php7.0-fpm
создает файл конфигурации /conf-available/php7.0-fpm.conf
. Как только это будет сделано, и Apache2 сможет затем запустить модуль PHP7 в качестве службы быстрого CGI.
– Talvi Watia
21 November 2017 в 13:49
Я знаю, что это должно звучать глупо ... но редко бывает.
Проверьте, пытаетесь ли вы выполнить php из
**http://localhost/info.php**
, а не из
file:///var/www/info.php
ps> вы можете заметить, что если вы пишете из shell
php info.php
, то ответьте на код (это означает php-функции) ..
Если у вас есть такая конфигурация:
<VirtualHost *:80>
ServerName example.com
DocumentRoot "/var/www/example.com"
<FilesMatch "\.php$">
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
</VirtualHost>
Раскомментируйте следующие строки в вашем httpd.conf
LoadModule proxy_module lib/httpd/modules/mod_proxy.so
LoadModule proxy_fcgi_module lib/httpd/modules/mod_proxy_fcgi.so
Это работает для меня
AddType application/x-httpd-php .php
. Большое спасибо!! – MatuDuke 25 July 2012 в 03:03apt-get purge apache2; apt-get install apache2 libapache-mod-php5
– ulkas 16 September 2014 в 21:41.php
с содержимым<?php echo("Success"); ?>
и посмотреть, приводит ли к нему доступ к файлу через веб-браузер в & quot; Success & quot; отображается без соответствующего кода PHP. – shmeeps 18 April 2016 в 03:29