تالار گفتمان nCIS.ir

نسخه‌ی کامل: فرق use با require_once؟
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام دوستان
فرق بین استفاده از use در namespace با require_once چیست؟
متشکرم
دستور use در داخل namespace (که البته داخلش نیست و قبلش نوشته میشه) برای کوتاه‌کردن نام کامل کلاس و عدم نیاز به ذکر کامل اسم کلاس (همراه با فضای نام) هست و اصلاً فایل رو ضمیمه نمیکنه (برخلاف include و require و include_once و require_once که کارشون ضمیمه‌کردن اسکریپت‌های دیگه است. به این مثال دقت کنید تا کاربرد use رو متوجه بشین:
<?php

namespace Controllers;

public class AuthController extends Controller
{
    public function actionIndex()
    {
        /** @var ModelsUser $user */

        $user = ModelsUser::findOne($_POST['id']);
        // ...
    }
}

حالا به نسخه‌ی دیگری از همین کد که از use استفاده میکنه دقت کنید:
<?php

use ModelsUser;

namespace Controllers;

public class AuthController extends Controller
{
    public function actionIndex()
    {
        /** @var User $user */

        $user = User::findOne($_POST['id']);
        // ...
    }
}

درواقع اگه کلاس موردنظرتون توی فضای نام دیگری بجز فضای نام جاری فعلی باشه (که با namespace مشخص کردین) یا باید نام کامل کلاس مربوطه (همراه با فضای نامش) رو بنویسین و یا با استفاده از use کلاس و فضای نامش رو معرفی کنین تا بتونین فقط از اسم کلاس استفاده کنید. درحقیقت PHP وقتی اسم کلاس خالی میبینه ابتدا توی فضای نام جاری دنبالش میگرده و اگه پیدا نکرد، توی فضاهای نامی که با use معرفی شدن جستجو میکنه.
ببینید اینکه میگم درسته:
اول همه کلاسها رو با spl_auto_register آماده require شدن میکنیم(هر وقت لازم شد require میشن)، حالا ممکنه چند تا از این کلاسها نام یکسان داشته باشن، برای اینکه معلوم بشه کدوم یک از کلاسها باید require بشن از use استفاده میکنیم.
و اینکه اگه کاملاً میدونیم کلاسهای همنام وجود ندارن، نیازی به استفاده از namespace و use نیست.
یه مقدار نیاز به اصلاح داره صحبتتون:
  1. use فقط برای خلاصه‌کردن استفاده از اسم کلاس داخل کد هست تا همیشه لازم نباشه namespace هم پشت اسم کلاس ذکر بشه و هیچ ربطی به مشخص‌کردن نداره. شما بدون use هم میتونین مشخص کنین (با ذکر کامل اسم کلاس همراه با فضای نام).
  2. استفاده از فضای نام برای تفکیک محدوده‌ی اعتبار کلاس‌هاست که تداخل نام، فقط یکی از مشکلاتی هست که حل میکنه. امتیاز اصلی فضای نام، ایجاد یک فضای اختصاصی برای عناصر داخلی اون فضا (مثل کلاس‌ها و اعضای اونها یعنی متدها و فیلدها) هست. مثلاً یک کلاس خاص اگه میخواین فقط توی فضای نام خودش اعتبار داشته باشه و توی فضاهای نام دیگه نشه ازش استفاده کرد، کافیه که بصورت public تعریفش نکنید. برای درک بهتر فضای نام، پست بعدی رو بخونید.
منبع: https://www.php.net/manual/en/language.n...ionale.php
فضاهای نام چیستند؟ در کلی‌ترین تعریف، فضاهای نام راهی برای کپسوله‌سازی اجزا هستند. این موضوع می‌تواند بصورت یک مفهوم انتزاعی در موقعیت‌های زیادی درنظر گرفته شود. برای مثال، در هر سیسیتم‌عامل، پوشه‌ها نقش گروه‌بندی فایل‌های مرتبط را ایفا می‌کنند و بعنوان یک فضای نام برای فایل‌های داخلشان عمل می‌نمایند. بعنوان یک مثال دقیق‌تر، فایل foo.txt می‌تواند در هر دو پوشه‌ی /home/greg و /home/other وجود داشته باشد، اما دو نسخه از foo.txt نمی‌توانند همزمان در یک پوشه وجود داشته باشند. بعلاوه، برای دسترسی به foo.txt خارج‌از مسیر /home/greg باید نام مسیر را به ابتدای نام فایل به‌همراه جداکننده‌ی مسیر اضافه کنیم تا به [/ltr]/home/greg/foo.txt[/ltr] برسیم. این مفهوم به فضاهای نام در دنیای برنامه‌نویسی گسترش پیدا می‌کند.

در دنیای PHP، فضاهای نام برای حل دو مشکل که نویسندگان کتابخانه‌ها و برنامه‌های کاربردی در زمان ساخت عناصر کد با قابلیت استفاده‌ی مجدد (مثل کلاس‌ها یا توابع) با آن مواجه می‌شوند، طراحی شده‌اند.

  1. تداخل نام بین کدی که شما تولید می‌کنید با کلاس‌ها/توابع/ثابت‌های داخلی PHP یا تولیدشده توسط اشخاص ثالث
  2. قابلیت تعریف نام مستعار یا خلاصه‌سازی اسامی_بسیار_طولانی تولیدشده برای حل مشکل اول و افزایش قابلیت خوانایی کد منبع

فضاهای نام PHP روشی ارائه می‌دهند که در آن می‌توان کلاس‌ها، رابط‌ها، توابع و ثابت‌های مرتبط را گروه‌بندی کرد. در اینجا مثالی از دستور زبان فضای نام در PHP وجود دارد:

<?php
namespace myname; // see "Defining Namespaces" section

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

$a = new MyClass;
$c = new mynameMyClass; // see "Global Space" section

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

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

نکته: فضاهای نام به بزرگی و کوچکی حروف حساس نیستند.

نکته: فضای نام PHP و اسامی ترکیبی که با این نام شروع می‌شوند (مثل PHPClasses) برای استفاده‌ی داخلی زبان رزرو شده‌اند و نباید در کدهای فضای کاربری مورد استفاده قرار گیرند.

نقل قول:
Reference: https://www.php.net/manual/en/language.n...ionale.php

What are namespaces? In the broadest definition namespaces are a way of encapsulating items. This can be seen as an abstract concept in many places. For example, in any operating system directories serve to group related files, and act as a namespace for the files within them. As a concrete example, the file foo.txt can exist in both directory /home/greg and in /home/other, but two copies of foo.txt cannot co-exist in the same directory. In addition, to access the foo.txt file outside of the /home/greg directory, we must prepend the directory name to the file name using the directory separator to get /home/greg/foo.txt. This same principle extends to namespaces in the programming world.

In the PHP world, namespaces are designed to solve two problems that authors of libraries and applications encounter when creating re-usable code elements such as classes or functions:

  1. Name collisions between code you create, and internal PHP classes/functions/constants or third-party classes/functions/constants.
  2. Ability to alias (or shorten) Extra_Long_Names designed to alleviate the first problem, improving readability of source code.

PHP Namespaces provide a way in which to group related classes, interfaces, functions and constants. Here is an example of namespace syntax in PHP:
<?php
namespace myname; // see "Defining Namespaces" section

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

$a = new MyClass;
$c = new mynameMyClass; // see "Global Space" section

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

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

Note: Namespace names are case-insensitive.

Note: The Namespace name PHP, and compound names starting with this name (like PHPClasses) are reserved for internal language use and should not be used in the userspace code.
(05-06-1399، 10:40 ق.ظ)ADMIN نوشته: [ -> ]...یک کلاس خاص اگه میخواین فقط توی فضای نام خودش اعتبار داشته باشه و توی فضاهای نام دیگه نشه ازش استفاده کرد، کافیه که بصورت public تعریفش نکنید...
[/list]

تعریف کلاس بصورت public رو متوجه نشدم.
تعریف فیلدها و متدها رو بصورت public, private, protected متوجهم ولی تعریف کلاس بصورت public رو نه.
(05-06-1399، 10:55 ق.ظ)ADMIN نوشته: [ -> ]منبع: https://www.php.net/manual/en/language.n...ionale.php
فضاهای نام چیستند؟ در کلی‌ترین تعریف، فضاهای نام راهی برای کپسوله‌سازی اجزا هستند...

حالا اگه برا کلاسهای داخل فولدر namespace ، libraries تعریف کنیم
namespace libraries;
و در قسمت app کلاس کنترلر به این شکل میشه:
use libraries\Controller as MainController;

class SiteController extends MainController {

    public function actionIndex() {
         $categories = (new Categories())->findAll();
         $this->render( 'index', compact( 'categories' ) );
   }

}
درسته؟
دقیقاً همینطوره
(05-06-1399، 01:07 ب.ظ)abdollah110110 نوشته: [ -> ]تعریف کلاس بصورت public رو متوجه نشدم.
تعریف فیلدها و متدها رو بصورت public, private, protected متوجهم ولی تعریف کلاس بصورت public رو نه.

خیلی ساده است. قبل از اسم کلاس از public استفاده میکنید. اونوقت اون کلاس خارج از پکیج یا فضای نام خودش هم قابل استفاده است (در غیر اینصورت فقط توی همون پکیج میشه ازش شئ ساخت یا از عناصر استاتیکش استفاده کرد). البته این قابلیت هنوز بطور کامل در PHP پشتیبانی نمیشه. فقط طبق اصول شئ‌گرایی که در زبان‌های کاملاً شئ‌گرا داره رعایت میشه توضیح دادم خدمتتون.