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

Основи

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

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

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

language.namespaces.basics.php

Користење на именски простори: Основи

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

Пред да разговараме за употребата на именски простори, важно е да разбереме како PHP знае кој именски елемент го бара вашиот код. Едноставна аналогија може да се направи помеѓу PHP именските простори и еден датотечен систем. Постојат три начини за пристап до датотека во датотечен систем:

  1. Име на релативна датотека како foo.txtОва се решава до currentdirectory/foo.txt where currentdirectory е директориумот што моментално го зафаќа. Значи, ако тековниот директориум е /home/foo, името се решава до /home/foo/foo.txt.
  2. Име на релативна патека како subdirectory/foo.txtОва се решава до currentdirectory/subdirectory/foo.txt.
  3. Име на апсолутна патека како /main/foo.txtОва се решава до /main/foo.txt.
Истиот принцип може да се примени и на именските елементи во PHP. На пример, името на класата може да се повикува на три начини:
  1. Неовластено име, или класа без префикс како $a = new foo(); or foo::staticmethod();. Ако тековниот именски простор е currentnamespace, ова се решава до currentnamespace\foo. Ако кодот е глобален, неименуван код, ова се решава до foo. Еден исклучок: неовластените имиња за функции и константи ќе се решат до глобални функции и константи ако именската функција или константа не е дефинирана. Видете Користење на именски простори: враќање на глобална функција/константа интерполација на низи
  2. Овластено име, или класа со префикс како $a = new subnamespace\foo(); or subnamespace\foo::staticmethod();. Ако тековниот именски простор е currentnamespace, ова се решава до currentnamespace\subnamespace\foo. Ако кодот е глобален, неименуван код, ова се решава до subnamespace\foo.
  3. Целосно овластено име, или име со префикс со оператор за глобален префикс како $a = new \currentnamespace\foo(); or \currentnamespace\foo::staticmethod();. Ова секогаш се решава до буквалното име наведено во кодот, currentnamespace\foo.

Еве пример за трите видови синтакса во вистински код:

file1.php

<?php
namespace Foo\Bar\subnamespace;

const
FOO = 1;
function
foo() {}
class
foo
{
static function
staticmethod() {}
}
?>

file2.php

<?php
namespace Foo\Bar;
include
'file1.php';

const
FOO = 2;
function
foo() {}
class
foo
{
static function
staticmethod() {}
}

/* Unqualified name */
foo(); // resolves to function Foo\Bar\foo
foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO

/* Qualified name */
subnamespace\foo(); // resolves to function Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // resolves to class Foo\Bar\subnamespace\foo,
// method staticmethod
echo subnamespace\FOO; // resolves to constant Foo\Bar\subnamespace\FOO

/* Fully qualified name */
\Foo\Bar\foo(); // resolves to function Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo \Foo\Bar\FOO; // resolves to constant Foo\Bar\FOO
?>

Забележете дека за пристап до која било глобална класа, функција или константа, може да се користи целосно овластено име, како што е \strlen() or \Exception или \INI_ALL.

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

<?php
namespace Foo;

function
strlen() {}
const
INI_ALL = 3;
class
Exception {}

$a = \strlen('hi'); // calls global function strlen
$b = \INI_ALL; // accesses global constant INI_ALL
$c = new \Exception('error'); // instantiates global class Exception
?>

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

richard на richard-sumilang точка com
пред 17 години
Syntax for extending classes in namespaces is still the same.

Lets call this Object.php:

<?php

namespace com\rsumilang\common;

class Object{
   // ... code ...
}

?>

And now lets create a class called String that extends object in String.php:

<?php

class String extends com\rsumilang\common\Object{
   // ... code ...
}

?>

Now if you class String was defined in the same namespace as Object then you don't have to specify a full namespace path:

<?php

namespace com\rsumilang\common;

class String extends Object
{
   // ... code ...
}

?>

Lastly, you can also alias a namespace name to use a shorter name for the class you are extending incase your class is in seperate namespace:

<?php

namespace com\rsumilang\util;
use com\rsumlang\common as Common;

class String extends Common\Object
{
   // ... code ...
}

?>

- Richard Sumilang
Анонимен
пред 11 години
<?php

namespace Foo;

try {
    // Something awful here
    // That will throw a new exception from SPL
} 
catch (Exception as $ex) {
    // We will never get here
    // This is because we are catchin Foo\Exception
}
?>

Instead use fully qualified name for the exception to catch it

<?php 

namespace Foo;

try {
    // something awful here
    // That will throw a new exception from SPL
} 
catch (\Exception as $ex) {
    // Now we can get here at last
}
?>
Лукас З
пред 14 години
Well variables inside namespaces do not override others since variables are never affected by namespace but always global:
"Although any valid PHP code can be contained within a namespace, only four types of code are affected by namespaces: classes, interfaces, functions and constants. "

Source: "Defining Namespaces"
http://www.php.net/manual/en/language.namespaces.definition.php
том на tomwardrop точка com
пред 14 години
It seems the file system analogy only goes so far. One thing that's missing that would be very useful is relative navigation up the namespace chain, e.g.

<?php
namespace MyProject {
   class Person {}
}

namespace MyProject\People {
    class Adult extends ..\Person {}
}
?>

That would be really nice, especially if you had really deep namespaces. It would save you having to type out the full namespace just to reference a resource one level up.
филип точка preisser на arcor точка de
пред 14 години
Working with variables can overwrite equal variables in other namespaces

<?php // php5 - package-version : 5.3.5-1ubuntu7.2

    namespace
    main
    {}

    namespace
    main\sub1
    {
        $data = 1;
    }

    namespace
    main\sub2
    {
        echo $data;// 1
        $data = 2;
    }

    namespace
    main\sub1
    {
        echo $data;// 2
        $data = 1;
    }

    namespace
    {
        echo $data;// 1
    }

?>
На оваа страница

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

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

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

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

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