PHP.mk документација

FAQ

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

language.namespaces.faq.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека language.namespaces.faq.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
FAQ

Референца за `language.namespaces.faq.php` со подобрена типографија и навигација.

language.namespaces.faq.php

Најчесто поставувани прашања: работи што треба да ги знаете за именските простори

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Овој најчесто поставувани прашања е поделен на два дела: вообичаени прашања и некои специфики на имплементацијата што се корисни за целосно разбирање.

Прво, вообичаените прашања.

  1. Ако не користам именски простори, дали треба да се грижам за нешто од ова?
  2. Како да користам внатрешни или глобални класи во именски простор?
  3. Како да користам класи, функции или константи од именски простор во нивниот сопствен именски простор?
  4. Како име како \my\name or \name се решава?
  5. Како име како my\name се решава?
  6. Како неквалификувано име на класа како name се решава?
  7. Како неквалификувано име на функција или неквалификувано име на константа како name се решава?

Постојат неколку детали за имплементацијата на именските простори што се корисни за разбирање.

  1. Имињата за увоз не смеат да се судираат со класи дефинирани во истата датотека.
  2. Вгнездени именски простори не се дозволени.
  3. Динамичките имиња на именски простори (идентификувани со наводници) треба да го избегнат знакот за коса црта.
  4. Недефинирани константи повикани со било кој знак за коса црта умираат со фатална грешка
  5. Не може да се презапишат специјални константи null, true or false

Ако не користам именски простори, дали треба да се грижам за нешто од ова?

Не. Именските простори не влијаат на постоечкиот код на било кој начин, или на било кој код што допрва треба да се напише, а кој не содржи именски простори. Можете да го напишете овој код ако сакате:

Пример #1 Пристап до глобални класи надвор од именски простор

<?php
$a
= new \stdClass;
?>

Ова е функционално еквивалентно на:

Пример #2 Пристап до глобални класи надвор од именски простор

<?php
$a
= new stdClass;
?>

Како да користам внатрешни или глобални класи во именски простор?

Пример #3 Пристап до внатрешни класи во именски простори

<?php
namespace foo;
$a = new \stdClass;

function
test(\ArrayObject $parameter_type_example = null) {}

$a = \DirectoryIterator::CURRENT_AS_FILEINFO;

// extending an internal or global class
class MyException extends \Exception {}
?>

Како да користам класи, функции или константи од именски простор во нивниот сопствен именски простор?

Пример #4 Пристап до внатрешни класи, функции или константи во именски простори

<?php
namespace foo;

class
MyClass {}

// using a class from the current namespace as a parameter type
function test(MyClass $parameter_type_example = null) {}
// another way to use a class from the current namespace as a parameter type
function test(\foo\MyClass $parameter_type_example = null) {}

// extending a class from the current namespace
class Extended extends MyClass {}

// accessing a global function
$a = \globalfunc();

// accessing a global constant
$b = \INI_ALL;
?>

Како име како \my\name or \name се решава?

Имињата што започнуваат со \ секогаш се решаваат онака како што изгледаат, така што \my\name е всушност my\nameПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во \Exception is Exception.

Пример #5 Целосно квалификувани имиња

<?php
namespace foo;
$a = new \my\name(); // instantiates "my\name" class
echo \strlen('hi'); // calls function "strlen"
$a = \INI_ALL; // $a is set to the value of constant "INI_ALL"
?>

Како име како my\name се решава?

Имињата што содржат коса црта, но не започнуваат со коса црта, како my\name може да се решат на 2 различни начини.

Ако постои изјава за увоз што преименува друго име во my, тогаш алијасот за увоз се применува на my in my\name.

Инаку, името на тековниот именски простор се додава пред my\name.

Пример #6 Квалификувани имиња

<?php
namespace foo;
use
blah\blah as foo;

$a = new my\name(); // instantiates "foo\my\name" class
foo\bar::name(); // calls static method "name" in class "blah\blah\bar"
my\bar(); // calls function "foo\my\bar"
$a = my\BAR; // sets $a to the value of constant "foo\my\BAR"
?>

Како неквалификувано име на класа како name се решава?

Имињата на класи што не содржат коса црта, како name може да се решат на 2 различни начини.

Ако постои изјава за увоз што преименува друго име во name, тогаш се применува алијасот за увоз.

Инаку, името на тековниот именски простор се додава пред name.

Пример #7 Неквалификувани имиња на класи

<?php
namespace foo;
use
blah\blah as foo;

$a = new name(); // instantiates "foo\name" class
foo::name(); // calls static method "name" in class "blah\blah"
?>

Како неквалификувано име на функција или неквалификувано име на константа како name се решава?

Имиња на функции или константи што не содржат коса црта, како name може да се решат на 2 различни начини.

Прво, името на тековниот именски простор се додава пред name.

На крај, ако константата или функцијата name не постои во тековниот именски простор, глобална константа или функција name се користи ако постои.

Пример #8 Неограничени имиња на функции или константи

<?php
namespace foo;
use
blah\blah as foo;

const
FOO = 1;

function
my() {}
function
foo() {}
function
sort(&$a)
{
\sort($a); // calls the global function "sort"
$a = array_flip($a);
return
$a;
}

my(); // calls "foo\my"
$a = strlen('hi'); // calls global function "strlen" because "foo\strlen" does not exist
$arr = array(1,3,2);
$b = sort($arr); // calls function "foo\sort"
$c = foo(); // calls function "foo\foo" - import is not applied

$a = FOO; // sets $a to value of constant "foo\FOO" - import is not applied
$b = INI_ALL; // sets $b to value of global constant "INI_ALL"
?>

Имињата за увоз не смеат да се судираат со класи дефинирани во истата датотека.

Следниве комбинации на скрипти се легални:

file1.php

<?php
namespace my\stuff;
class
MyClass {}
?>

another.php

<?php
namespace another;
class
thing {}
?>

file2.php

<?php
namespace my\stuff;
include
'file1.php';
include
'another.php';

use
another\thing as MyClass;
$a = new MyClass; // instantiates class "thing" from namespace another
?>

Нема конфликт на имиња, иако класата MyClass постои во my\stuff простор на имиња, бидејќи дефиницијата MyClass е во посебна датотека. Сепак, следниот пример предизвикува фатална грешка за конфликт на имиња бидејќи MyClass е дефинирана во истата датотека со изјавата use. PHP не дозволува вгнездување простори на имиња

<?php
namespace my\stuff;
use
another\thing as MyClass;
class
MyClass {} // fatal error: MyClass conflicts with import statement
$a = new MyClass;
?>

Вгнездени именски простори не се дозволени.

Сепак, лесно е да се симулираат вгнездени простори на имиња вака:

<?php
namespace my\stuff {
namespace
nested {
class
foo {}
}
}
?>
Динамички имиња на простори на имиња (квотирани идентификатори) треба да избегнуваат коса црта
<?php
namespace my\stuff\nested {
class
foo {}
}
?>

Многу е важно да се сфати дека бидејќи косата црта се користи како знак за бегство во низи, таа секогаш треба да се удвојува кога се користи во низа. Инаку постои ризик од несакани последици:

Пример #9 Опасности од користење имиња со простор на имиња во низа со двојни наводници

Во низа со единечни наводници, секвенцата за бегство со коса црта е многу побезбедна за употреба, но сепак се препорачува да се избегнуваат коси црти во сите низи како најдобра практика.

<?php
$a
= "dangerous\name"; // \n is a newline inside double quoted strings!
$obj = new $a;

$a = 'not\at\all\dangerous'; // no problems here.
$obj = new $a;
?>
Секоја недефинирана константа што е неограничена како

Недефинирани константи повикани со било кој знак за коса црта умираат со фатална грешка

ќе произведе известување објаснувајќи дека PHP претпоставил FOO беше вредноста на константата. Секоја константа, ограничена или целосно ограничена, што содржи коса црта ќе произведе фатална грешка ако не се најде. FOO Пример #10 Недефинирани константи

Секој обид за дефинирање на константа со простор на имиња што е специјална, вградена константа резултира со фатална грешка

<?php
namespace bar;
$a = FOO; // produces notice - undefined constants "FOO" assumed "FOO";
$a = \FOO; // fatal error, undefined namespace constant FOO
$a = Bar\FOO; // fatal error, undefined namespace constant bar\Bar\FOO
$a = \Bar\FOO; // fatal error, undefined namespace constant Bar\FOO
?>

Не може да се презапишат специјални константи null, true or false

Пример #11 Недефинирани константи

manolachef at gmail dot com

<?php
namespace bar;
const
NULL = 0; // fatal error;
const true = 'stupid'; // also fatal error;
// etc.
?>

Белешки од корисници 6 белешки

shaun at slickdesign dot com dot au
пред 13 години
There is a way to define a namespaced constant that is a special, built-in constant, using define function and setting the third parameter case_insensitive to false:

<?php
namespace foo;
define(__NAMESPACE__ . '\NULL', 10); // defines the constant NULL in the current namespace
var_dump(NULL); // will show 10
var_dump(null); // will show NULL
?>

  No need to specify the namespace in your call to define(), like it happens usually
<?php
namespace foo;
define(INI_ALL, 'bar'); // produces notice - Constant INI_ALL already defined. But:

define(__NAMESPACE__ . '\INI_ALL', 'bar'); // defines the constant INI_ALL in the current namespace
var_dump(INI_ALL); // will show string(3)"bar". Nothing unespected so far. But:

define('NULL', 10); // defines the constant NULL in the current namespace...
var_dump(NULL); // will show 10
var_dump(null); // will show NULL
?>

  If the parameter case_insensitive is set to true
<?php
namespace foo;
define (__NAMESPACE__ . '\NULL', 10, true); // produces notice - Constant null already defined
?>
Shaun на slickdesign точка com точка au
пред 9 години
When creating classes or calling static methods from within namespaces using variables, you need to keep in mind that they require the full namespace in order for the appropriate class to be used; you CANNOT use an alias or short name, even if it is called within the same namespace. Neglecting to take this into account can cause your code to use the wrong class, throw a fatal missing class exception, or throw errors or warnings.

In these cases, you can use the magic constant __NAMESPACE__, or specify the full namespace and class name directly. The function class_exists also requires the full namespace and class name, and can be used to ensure that a fatal error won't be thrown due to missing classes.

<?php

namespace Foo;
class Bar {
    public static function test() {
        return get_called_class();
    }
}

namespace Foo\Foo;
class Bar extends \Foo\Bar {
}

var_dump( Bar::test() ); // string(11) "Foo\Foo\Bar"

$bar = 'Foo\Bar';
var_dump( $bar::test() ); // string(7) "Foo\Bar"

$bar = __NAMESPACE__ . '\Bar';
var_dump( $bar::test() ); // string(11) "Foo\Foo\Bar"

$bar = 'Bar';
var_dump( $bar::test() ); // FATAL ERROR: Class 'Bar' not found or Incorrect class \Bar used
те0хад на NOSPAM точка gmail точка ком
пред 9 години
[Editor's note: that behavior is caused by a bug in PHP 7.0, which has been fixed as of PHP 7.0.7.]

Regarding the entry "Import names cannot conflict with classes defined in the same file".
- I found that since PHP 7.0 this is no longer the case.
In PHP 7.0 you can have a class with a name that matches an imported class (or namespace or both at the same time).

<?php
namespace ns1 {
  class ns1 {
    public static function write() {
      echo "ns1\\ns1::write()\n";
    }
  }
}

namespace ns1\ns1 {
  class ns1c {
    public static function write() {
      echo "ns1\\ns1\\ns1c::write()\n";
    }
  }
}

namespace ns2 {
  use ns1\ns1 as ns1; // both a class in ns1, and a namespace ns1\ns1
    
  // the next class causes fatal error in php 5.6, not in 7.0
  class ns1 {
    public static function write() {
      echo "ns2\\ns1::write()\n";
    }
  }
    
  ns1::write(); // calls imported ns1\ns1::write()
  ns1\ns1c::write(); // calls imported ns1\ns1\ns1c::write()
  namespace\ns1::write(); // calls ns2\ns1::write()
}
?>
theking2 на king точка ma
3 години пред
Just like class names currently namespaces are not case sensitive. So no errors will be shown here:

<?php declare(strict_types=1);
namespace Foo;
class Bar {
  public function __construct() {
    echo 'Map constructed';
  }
}

$foobar = new \foo\bar();
phpcoder
пред 10 години
Regarding "Neither functions nor constants can be imported via the use statement." Actually you can do it in PHP 5.6+:

<?php

// importing a function (PHP 5.6+)
use function My\Full\functionName;

// aliasing a function (PHP 5.6+)
use function My\Full\functionName as func;

// importing a constant (PHP 5.6+)
use const My\Full\CONSTANT;
?>
okaresz
12 години пред
To correct manolachef's answer: define() ALWAYS defines constants in the GLOBAL namespace.

As nl-x at bita dot nl states in the note at http://www.php.net/manual/en/function.define.php, the constant "NULL" can be defined with define() case-sensitively, but can only be retrieved with constant(), leaving the meaning of NULL uppercase keyword as the only value of the type null.
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.