2015-01-16 2 views
3

У меня возникли проблемы с вызовом функции из класса с именами в другом классе с именами. В приведенном ниже примере фиктивного я хотел бы знать, как использовать Class2 в Class1. Я получаю сообщение об ошибке:Функция вызова из разных классов и пространства имен

Trait 'name1\name2\Class2' not found in class1.php

Код:

#file index.php 

require "class1.php"; 
require "class2.php"; 
$class1 = new name1\Class1(); 
$class1->sayHello(); 

#file class1.php 

namespace name1{ 
    class Class1{ 
     use name2\Class2; 
     public function sayHello(){ 
      echo Class2::staticFunction(); 
     } 
    } 
} 

#file class2.php 

namespace name2{ 
    class Class2{ 
     public static function staticFunction(){ 
      return "hello!"; 
     } 
    } 
} 

Спасибо за любые советы.

+1

Вы синтаксическая ошибка: не 'публичного статического staticFunction()' ', но общественная статическая функция staticFunction()' – zavg

+1

Также в index.php: не просто 'SayHello()', но '$ class1-> SayHello(); ' – zavg

+0

Да @zavg thanks :), как я прокомментировал в других сообщениях, ошибки присутствовали, потому что это не фактический код. Это был просто (действительно плохо написанный :() фиктивный пример.: S – AlbertoGarrido

ответ

1

Итак, у вас есть несколько ошибок, которые я исправил. Вот рабочий код, который нужен:

# index.php 
include "class1.php"; 
include "class2.php"; 
$class1 = new name1\Class1(); 
$class1->sayHello(); 

# class1.php 
namespace name1; 
use name2\Class2; 
class Class1{ 
    public function sayHello(){ 
     echo Class2::staticFunction(); 
    } 
} 

# class2.php 
namespace name2; 
class Class2{ 
    public static function staticFunction(){ 
     return "hello!"; 
    } 
} 

Некоторых пояснения:

  • Когда в определении класса use используется для использования traits и не namespace
  • В PHP namespace нужен не быть заключен в фигурном скобки
  • В PHP вы включаете файлы с include, include_once, require, или require_once, а не import
+0

Ошибки присутствовали, потому что это не фактический код. Это был просто (действительно плохо написанный :() фиктивный пример. Я принимаю ответ. Спасибо! – AlbertoGarrido

+1

cool, я добавил еще несколько объяснений, которые Надеюсь, вам поможет лучше понять, что происходит :) – mrun

1

Внутри первого класса, ваша черта звонит Class2 как use name2\Class2, но вы все еще в name1{} пространстве имен, так что в действительности вы вызываете его как: use name1\name2\Class2

Итак, вам необходимо изменить

use name2\Class2; до use \name2\Class2

Попробуйте это.

namespace name1{ 
    use \name2\Class2; 
    class Class1{ 
     public function sayHello(){ 
      echo Class2::staticFunction(); 
     } 
    } 
} 

#file class2.php 

namespace name2{ 
    class Class2{ 
     public static staticFunction(){ 
      return "hello!"; 
     } 
    } 
} 

Кроме того, еще один совет: Если вы отделяете классы в отдельных файлах, вам не нужно, чтобы отделить их, как в них так, как вы сделали. Просто позвоните в простое пространство имен:

+0

Привет @sam_io спасибо за ответ, который тоже не работает, я получаю: PHP Неустранимая ошибка: name1 \ Class1 не может использовать name2 \ Class2 - это не черта – AlbertoGarrido

+1

Удалите «use \ name2 \ Class2» вне класса. @albertogarrido снова проверит мой пример. В классе могут быть вызваны только черты. – samayo

+0

Выбрав инструкцию «use», я получаю: Call to undefined function sayHello() – AlbertoGarrido

1

Почему бы не отказаться от статического метода и просто ввести класс? Похоже, что вы делаете дополнительную работу для чего-то такого простого. Это аргументы функции.

namespace name1{ 
    use \name2\Class2; 
    class Class1{ 
     public function sayHello($Class2){ 
      echo $Class2->someFunction(); 
     } 
    } 
} 

namespace name2{ 
    class Class2{ 
     public function someFunction(){ 
      return "hello!"; 
     } 
    } 
} 

#index.php 
include "class1.php"; 
include "class2.php"; 
$Class1 = new name1\Class1(); 
$Class2 = new name2\Class2(); 
$Class1->sayHello($Class2); 
//hello! 
+0

Спасибо @Tek, но это фиктивный пример, на самом деле код должен быть статической функцией. В любом случае, сомневаюсь, что это не t. – AlbertoGarrido