PECS (сокращение от «Производитель extends
и Consumer super
») объясняется: принципом «Get and Put»
Указывает, что
1. For Extends Wildcard (получить значения, т. Е. Producer extends
)
Вот метод, который берет набор чисел, преобразует каждый в double
и суммирует их вверх
public static double sum(Collection<? extends Number> nums) {
double s = 0.0;
for (Number num : nums)
s += num.doubleValue();
return s;
}
Назовем метод:
List<Integer>ints = Arrays.asList(1,2,3);
assert sum(ints) == 6.0;
List<Double>doubles = Arrays.asList(2.78,3.14);
assert sum(doubles) == 5.92;
List<Number>nums = Arrays.<Number>asList(1,2,2.78,3.14);
assert sum(nums) == 8.92;
Поскольку метод sum()
использует extends
, все следующие вызовы являются законными. Первые два вызова не были бы законными, если бы расширения не использовались.
ИСКЛЮЧЕНИЕ : вы не можете помещать что-либо в тип, объявленный с помощью подстановочного знака extends
, за исключением значения null
, который относится к каждому ссылочному типу:
List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);
List<? extends Number> nums = ints;
nums.add(null); // ok
assert nums.toString().equals("[1, 2, null]");
2. Для Super Wildcard (put values ie Consumer super
)
Вот метод, который принимает набор чисел и int n
, и помещает первые n
целые числа, начиная с нуля, в сбор:
public static void count(Collection<? super Integer> ints, int n) {
for (int i = 0; i < n; i++) ints.add(i);
}
Давайте назовем метод:
List<Integer>ints = new ArrayList<Integer>();
count(ints, 5);
assert ints.toString().equals("[0, 1, 2, 3, 4]");
List<Number>nums = new ArrayList<Number>();
count(nums, 5); nums.add(5.0);
assert nums.toString().equals("[0, 1, 2, 3, 4, 5.0]");
List<Object>objs = new ArrayList<Object>();
count(objs, 5); objs.add("five");
assert objs.toString().equals("[0, 1, 2, 3, 4, five]");
Поскольку метод count()
использует super
, все следующие звонки законны: последние два вызова не были бы законными, если бы супер не использовался.
ИСКЛЮЧЕНИЕ : вы не можете получить что-либо из типа, объявленного с помощью super
за исключением значения типа Object
, которое является супертипом каждого ссылочного типа:
List<Object> objs = Arrays.<Object>asList(1,"two");
List<? super Integer> ints = objs;
String str = "";
for (Object obj : ints) str += obj.toString();
assert str.equals("1two");
3. Когда оба Get и Put, не используйте wildcard
. Когда вы оба вставляете значения и получаете значения из одной и той же структуры, вы не должны использовать подстановочный знак.
public static double sumCount(Collection<Number> nums, int n) {
count(nums, n);
return sum(nums);
}
Это строка API Сервера поверх выхода phpinfo () :
[/g4]
Однако, пожалуйста, обратите внимание что он не скажет вам точную версию Apache или точного обработчика CGI. Он просто описывает используемый SAPI.
Вы также можете вызвать функцию php_sapi_name () (или константу PHP_SAPI , которая предоставляет такую же информацию) :
Описание
string php_sapi_name ( void )
Возвращает строчную строку, описывающую тип интерфейса (API-интерфейс сервера, SAPI), который использует PHP , Например, в CLI PHP эта строка будет «cli», тогда как с Apache она может иметь несколько разных значений в зависимости от конкретного используемого SAPI
blockquote>. По-прежнему рекомендуется проверить документацию HSP, поскольку возможно, доступно несколько версий PHP.
Помните, что вам нужно запустить
phpinfo()
из той же среды, которую вы хотите проверить (веб-сервер не скажет вам о командной строке и наоборот):C:\>php -i | findstr /C:"Server API" Server API => Command Line Interface
$ php -i | grep 'Server API' Server API => Command Line Interface
Вы можете использовать ссылку ниже: Как определить, что php работает как php cgi или apache module?
или создать файл info.php
и ввести
<?php
phpinfo();
?>
теперь запускает файл с вашим доменным именем.
находит API сервера в файле и показывает, что PHP работает на сервере с CGI OR Apache