2013-07-19 24 views
36

Tôi đang sử dụng PHP 5.4 và có cấu trúc lớp PSR-0 tương tự như sau.Không thể sử dụng X làm Y vì tên đã được sử dụng, mặc dù nó không phải là

A \ Library \ Session.php:

namespace A\Library; 

class Session { ... } 

My \ Application \ Session.php:

namespace My\Application; 

class Session { ... } 

My \ Application \ Facebook.php:

namespace My\Application; 
use A\Library\Session; 

class Facebook { ... } 

Khi tôi cố gắng để chạy các ứng dụng, tôi nhận được lỗi sau:

Cannot use A\Library\Session as Session because the name is already in use in My\Application\Facebook.php

Mặc dù nó không phải là, ít nhất là không trong tập tin này. Tệp Facebook.php chỉ khai báo lớp Facebook và nhập chính xác một lớp Session, một lớp A\Library.

Vấn đề duy nhất tôi có thể thấy là lớp Session khác tồn tại trong cùng một không gian tên như lớp Facebook, nhưng vì nó chưa bao giờ được nhập trong tệp Facebook.php, tôi nghĩ nó không quan trọng chút nào.

Tôi có sai không (trong trường hợp đó, vui lòng trỏ đến tài liệu liên quan), hoặc đây có phải là lỗi không?

+0

Có thể cần thêm mã vì tôi không thấy sự cố hiện tại – exussum

+0

Trong trường hợp của tôi, tôi đã nhầm lẫn trong không gian tên ... –

Trả lời

23

Có một lỗi xác nhận trong PHP mà có thể ảnh hưởng đến hành vi mà bạn nhìn thấy . Nó được coi là lỗi nghiêm trọng, nhưng với opcache được kích hoạt, nó vẫn có thể thực thi hoàn hảo.

https://bugs.php.net/bug.php?id=66773

Nếu vẫn còn liên quan đến bạn, vui lòng bỏ phiếu cho lỗi này.

+0

Có vẻ như đây thực sự là lỗi, trái ngược với câu trả lời khác. Lỗi bạn đề cập và [# 66862] (https://bugs.php.net/bug.php?id=66862) đã được sửa vào ngày 10 tháng 11 năm 2016. – Benjamin

+1

khởi động lại php-fpm trên máy chủ đã giải quyết vấn đề này cho tôi – didiliche

+0

@ dliche Có lẽ vì PHP đã được cập nhật kể từ lần khởi động lại cuối cùng. – Benjamin

10

The only problem I can see is that another Session class exists in the same namespace as the Facebook class, but as it was never imported in the Facebook.php file, I thought it did not matter at all.

Vâng, nó quan trọng. Đây là lý do tại sao bạn không cần phải "nhập" các lớp học từ cùng một không gian tên. Nếu bạn có xung đột tên từ các không gian tên khác nhau, bạn cần phải bí danh lớp.

namespace My\Application; 
use A\Library\Session as ASession; // choose a proper alias name here 

class Facebook { ... } 
+0

Tôi vẫn không hiểu tại sao. Với tôi, nếu tôi sử dụng Session từ bên trong 'My \ Application', và không có' use' cho cái này, thì nó sẽ giải quyết nó thành 'My \ Application \ Session'. Nhưng nếu có, nó sẽ sử dụng cái này. Tài liệu rõ ràng nói rằng nhập khẩu là * cho mỗi tệp *, vậy tại sao nó sẽ tìm kiếm các lớp được định nghĩa trong một tệp khác? – Benjamin

+0

Nó không phải là tuyên bố sử dụng gây ra vấn đề. Vấn đề là không gian tên \ My \ Application của bạn có lớp \ My \ Application \ Session.Do đó, nếu bạn nhập một lớp Session khác vào phạm vi không gian tên \ My \ Application của bạn (thông qua sử dụng), bạn sẽ có một lớp Phiên làm việc xung đột. –

+0

Nhưng vì PHP là một ngôn ngữ động, điều đó không quan trọng bởi vì thông dịch viên có thể không * biết * tại thời điểm đó có một lớp Session trong không gian tên này? – Benjamin

22

Không, đây không phải là lỗi. Như đã đề cập trong Using namespaces: Aliasing/Importing

use A\Library\Session;

là giống như:

use A\Library\Session as Session; 

Vì vậy, hãy thử sử dụng một cái gì đó như:

use A\Library\Session as AnotherSessionClassName; 
+0

Như tôi đã nói với John Cartwright, bây giờ nó hoạt động và tôi không thể giải thích tại sao. Có vẻ như điều này đi ngược lại câu trả lời của bạn; bạn đã cố tự mình tái sản xuất chưa? Bất kỳ bình luận về điều này? – Benjamin

+0

Tôi đã cố gắng tái tạo trường hợp của bạn. Vì vậy, tôi đã tạo ra cấu trúc thư mục của bạn, tức là A \ Library và My \ Application và các tệp đã đề cập, Và tôi đã thêm một số mã thử nghiệm vào cuối Facebook.php để tạo một đối tượng phiên. Nhưng tôi không hiểu cách bạn sử dụng mệnh đề 'use' để nhập lớp Session! Tôi đã thêm một câu lệnh 'require ('../../ A/Library/Session.php'),' before 'use' và nó hoạt động hoàn hảo! – Mohsenme

+0

'use' chỉ bí danh tên ngắn cho FQCN trong tệp hiện tại, trong khi' require' thực thi mã chứa trong tệp đích, chúng hoàn toàn khác! Ý anh là gì? – Benjamin

Các vấn đề liên quan