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

Преглед

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

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

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

language.namespaces.rationale.php

Преглед на именските простори

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

Што се именски простори? Во најширока дефиниција, именските простори се начин за групирање на ставки. Ова може да се види како апстрактен концепт на многу места. На пример, во кој било оперативен систем, директориумите служат за групирање на сродни датотеки и дејствуваат како именски простор за датотеките во нив. Како конкретен пример, датотеката foo.txt може да постои и во директориумот /home/greg и во /home/other, но две копии од foo.txt не можат да коегзистираат во истиот директориум. Покрај тоа, за да пристапите до foo.txt датотеката надвор од /home/greg директориумот, мора да го претставите името на директориумот пред името на датотеката користејќи го разделувачот на директориуми за да добиете /home/greg/foo.txt. Истиот принцип се протега и на именските простори во светот на програмирањето.

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

  1. Судир на имиња помеѓу кодот што го создавате и внатрешните PHP класи/функции/константи или класи/функции/константи од трети страни.
  2. Можност за алијасирање (или скратување) на Имиња_Со_Многу_Долги_Имиња дизајнирани да го ублажат првиот проблем, подобрувајќи ја читливоста на изворниот код.

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

Пример #1 Пример за синтакса на именски простор

<?php
namespace my\name; // see "Defining Namespaces" section

class MyClass {}
function
myfunction() {}
const
MYCONST = 1;

$a = new MyClass;
$c = new \my\name\MyClass; // see "Global Space" section

$a = strlen('hi'); // see "Using namespaces: fallback to global
// function/constant" section

$d = namespace\MYCONST; // see "namespace operator and __NAMESPACE__
// constant" section
$d = __NAMESPACE__ . '\MYCONST';
echo
constant($d); // see "Namespaces and dynamic language features" section
?>

Забелешка: Имињата на именските простори не прават разлика помеѓу големи и мали букви.

Забелешка:

Името на именскиот простор PHP, и составните имиња што започнуваат со ова име (како PHP\Classes) се резервирани за внатрешна употреба на јазикот и не треба да се користат во кодот на корисничкиот простор.

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

SteveWa
пред 15 години
Thought this might help other newbies like me...

Name collisions means: 
you create a function named db_connect, and somebody elses code that you use in your file (i.e. an include) has the same function with the same name.

To get around that problem, you rename your function SteveWa_db_connect  which makes your code longer and harder to read.

Now you can use namespaces to keep your function name separate from anyone else's function name, and you won't have to make extra_long_named functions to get around the name collision problem.

So a namespace is like a pointer to a file path where you can find the source of the function you are working with
Дмитриј Сниткене
пред 14 години
Just a note: namespace (even nested or sub-namespace) cannot be just a number, it must start with a letter.
For example, lets say you want to use namespace for versioning of your packages or versioning of your API:

namespace Mynamespace\1;  // Illegal
Instead use this:
namespace Mynamespace\v1; // OK
pierstoval на gmail точка com
пред 11 години
To people coming here by searching about namespaces, know that a consortium has studied about best practices in PHP, in order to allow developers to have common coding standards.
 
These best practices are called "PHP Standard Recommendations" , also known as PSR.
 
They are visible on this link : http://www.php-fig.org/psr
 
Actually there are 5 coding standards categories : 
PSR-0 : Autoloading Standard , which goal is to make the use of Namespaces easier, in order to convert a namespace into a file path.
PSR-1 : Basic Coding Standard , basically, standards :) 
PSR-2 : Coding Style Guide, where to put braces, how to write a class, etc.
PSR-3 : Logger Interface , how to write a standard logger
PSR-4 : Improved Autoloading , to resolve more Namespaces into paths.
 
The ones I want to point are PSR-0 and PSR-4 : they use namespaces to resolve a FQCN (Fully qualified class name = full namespace + class name) into a file path. 
Basic example, you have this directory structure :
./src/Pierstoval/Tools/MyTool.php

The namespacing PSR-0 or PSR-4 standard tells that you can transform this path into a FQCN.
Read the principles of autoload if you need to know what it means, because it's almost mandatory ;) .

Structure :
{path}/autoloader.php
{path}/index.php
{path}/src/Pierstoval/Tools/MyTool.php

Files :

<?php
    // {path}/index.php
    include 'autoloader.php';
    $tool = new Pierstoval/Tools/MyTool();
?>

<?php
    // {path}/src/Pierstoval/Tools/MyTool.php
    namespace Pierstoval\Tools;
    class MyTool {}
?>

<?php
    // {path}/autoloader.php
    function loadClass($className) {
        $fileName = '';
        $namespace = '';

        // Sets the include path as the "src" directory
        $includePath = dirname(__FILE__).DIRECTORY_SEPARATOR.'src';

        if (false !== ($lastNsPos = strripos($className, '\\'))) {
            $namespace = substr($className, 0, $lastNsPos);
            $className = substr($className, $lastNsPos + 1);
            $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
        }
        $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
        $fullFileName = $includePath . DIRECTORY_SEPARATOR . $fileName;
        
        if (file_exists($fullFileName)) {
            require $fullFileName;
        } else {
            echo 'Class "'.$className.'" does not exist.';
        }
    }
    spl_autoload_register('loadClass'); // Registers the autoloader
?>
 
A standardized autoloader will get the class you want to instanciate (MyTool) and get the FQCN, transform it into a file path, and check if the file exists. If it does, it will <?php include(); ?> it, and if you wrote your class correctly, the class will be available within its correct namespace.
Then, if you have the following code :
<?php $tool = new Pierstoval/Tools/MyTool(); ?>
The autoloader will transform the FQCN into this path :
{path}/src/Pierstoval/Tools/MyTool.php

This might be the best practices ever in PHP framework developments, such as Symfony or others.
shewa12kpi на gmail точка ком
пред 4 години
<?php
//Here is the simple use case of namespace. See how we can use same named class with the help of namespace. This is how namespace resolve naming collision.

namespace Mobile;

class User 
{

    public $name = 'mobile user';
}

$user = new \Mobile\User;
echo $user->name;

namespace TV ;

class User 
{
    public static $name = 'tv user';
}

echo \TV\User::$name;
На оваа страница

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

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

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

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

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