2

I'm searching for following issue i have. The class file names of our project are named logon.class.php But the interface file for that class is named logon.interface.php

My issue i have is that when the autoload method runs I should be able to detect if it is a class call or an interface call.

<?php 
function __autoload($name){
    if($name === is_class){
        include_once($name.'class.php');
    }elseif ($name === is_interface){
         include_once($name.'interface.php');
    }
}
?>
Tim Visée
  • 2,988
  • 4
  • 45
  • 55
Jan Van Looveren
  • 908
  • 2
  • 11
  • 21
  • 1
    How can you define a class and an interface with the same name and expect to use both? Try running this: `class x {} interface x {}` – Explosion Pills Oct 28 '11 at 03:46
  • 1
    I usually append `I` to the start of the filename and interface name – Stoosh Oct 28 '11 at 03:47
  • I do what Stoosh does as well. I have IClassName for interfaces, AClassName for abstract classes and CClassname for classes. – F21 Oct 28 '11 at 03:48
  • In the past i Used also this prefix before the interface. But now with the use of namespace, i have a namespace specific for interface – Jan Van Looveren Oct 28 '11 at 04:20
  • In addition to what @tandu said, you should seriously take a look at [PSR-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md). Seriously. – igorw Oct 28 '11 at 07:11

3 Answers3

3

You can use ReflectionClass::isInterface to determine if the class is an interface.

$reflection = new ReflectionClass($name);

if ($reflection->isInterface()){
  //Is an interface
}else{
  //Not an interface
}

In your case, you would probably have to use file_exist first on $name.interface.php and $name.class.php to determine if they exist, require the one that exists, then check if it's an interface.

However, my opinion is that this might cause problems down the track. What if you have MyClass.class.php and MyClass.interface.php?

F21
  • 32,163
  • 26
  • 99
  • 170
0

To avoid class name clashes you can use namespaces. Check The PSR-0 specifications.

Also check this post. If you read the contents of the file before including it, you can tokenize it and figure if the file contains an Interface or a class, without actually loading the class/interface. Keep in mind that interfaces and classes can't have the same name

Note: Using this method you can actually change the name of the interface at runtime (before loading the class, although that does seem very good practice)

Community
  • 1
  • 1
Tivie
  • 18,864
  • 5
  • 58
  • 77
0

You should have some naming conventions for your classes and interfaces e.g. your class name is logon and interface name logon_interface, then you can easily differentiate between the two. For example, explode $name by underscore and check if last element is interface.

Vikk
  • 3,353
  • 3
  • 22
  • 24