PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks. |
 |

31-08-2020, 15:59
|
markusOk
Registrierter Benutzer
|
|
Registriert seit: Aug 2020
Beiträge: 3
|
|
Class not found
Fehler passiert auf Zeile 30 im index.php -> Class 'App\Post\PostController' not found in .../index.php. Kurioserweise beim Aufruf von get_declared_classes() in autoload.php gleich umittelbar nach implizitem Aufruf der Funktion wird App\Post\PostController als Klasse im Array aufgelistet
Datenstruktur ist folgende:
index.php
src/Post/ -> PostController.php, PostGateway.php
/startup/ -> autoload.php, dbconn.php, init.php
index.php
PHP-Code:
<?php
namespace App;
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json; charset=UTF-8');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Max-Age: 3600');
header('Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With');
include_once('./startup/init.php');
//var_dump(new Post\PostController());
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$uri_parts = explode('/', $uri);
$requestMethod = $_SERVER['REQUEST_METHOD'];
$ressourceClass = $uri_parts[1];
$id = null;
if(isset($uri_parts[2])){
$id = (int) $uri_parts[2];
}
switch ($ressourceClass) {
case 'posts':
$controller = new PostPostController($dbconn, $requestMethod, $id);
$controller->processRequest();
break;
default:
header('HTTP/1.1 404 Not Found');
exit();
// break;
}
?>
PostController.php
PHP-Code:
namespace AppPost;
class PostController****{...}
init.php
PHP-Code:
namespace App;
echo 'autoload will load';
require __DIR__.'/autoload.php';
require __DIR__.'/dbconn.php';
autoload.php
PHP-Code:
spl_autoload_register(function ($class) {
// project-specific namespace prefix
$prefix = 'App\\';
// base directory for the namespace prefix
$base_dir = dirname(dirname(__FILE__)) . '/src/';
// does the class use the namespace prefix?
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
// no, move to the next registered autoloader
return;
}
// get the relative class name
$relative_class = substr($class, $len);
// replace the namespace prefix with the base directory, replace namespace
// separators with directory separators in the relative class name, append
// with .php
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
print 'File: '.$file;
// if the file exists, require it
if (file_exists($file)) {
require $file;
print_r(get_declared_classes());
$controller = new AppPostPostController(null, 'GET', 1);
}
});
|

31-08-2020, 16:06
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 3.769
|
|
Bitte Code posten, den man auch selber bei sich ausführen kann.
|

31-08-2020, 16:20
|
markusOk
Registrierter Benutzer
|
|
Registriert seit: Aug 2020
Beiträge: 3
|
|
Besserer Code?
Ich denke, der Code ist eigentlich schon ziemlich generisch und sollte sofern die File-Struktur stimmt überall ausführbar sein. Hoffe das hilft:
index.php
PHP-Code:
<?php
namespace App;
include_once('./startup/init.php');
$controller = new PostPostController();
?>
PostController.php
PHP-Code:
namespace AppPost;
class PostController{}
init.php
PHP-Code:
namespace App;
require __DIR__.'/autoload.php';
require __DIR__.'/dbconn.php';
autoload.php
PHP-Code:
spl_autoload_register(function ($class) {
// project-specific namespace prefix
$prefix = 'App\\';
// base directory for the namespace prefix
$base_dir = dirname(dirname(__FILE__)) . '/src/';
// does the class use the namespace prefix?
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
// no, move to the next registered autoloader
return;
}
// get the relative class name
$relative_class = substr($class, $len);
// replace the namespace prefix with the base directory, replace namespace
// separators with directory separators in the relative class name, append
// with .php
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
print 'File: '.$file;
// if the file exists, require it
if (file_exists($file)) {
require $file;
print_r(get_declared_classes());
}
});
|

31-08-2020, 16:38
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 3.769
|
|
Es wäre einfacher, wenn der Code nicht so unnötig in mehrere Dateien und Ordner verstreut wäre. Ich blick bei der Ordnerstruktur ehrlich gesagt nicht durch. Und das ist für den Problemfall ja komplett irrelevant, also warum muss man sich damit abmühen?
Es ist eigentlich deine Aufgabe ein simplifiziertes Beispiel zu erstellen, bei dem das Problem nachvollziehbar auftritt, als das andere sich in deine Anwendung hineindenken und verstehen müssen.
|

31-08-2020, 16:53
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 3.769
|
|
Ich hab das ganze mal simplifiziert und so funktionierts:
index.php:
PHP-Code:
<?php
namespace { spl_autoload_register(function ($class) { // project-specific namespace prefix $prefix = 'App\\';
// base directory for the namespace prefix $base_dir = __DIR__;
// does the class use the namespace prefix? $len = strlen($prefix); if (strncmp($prefix, $class, $len) !== 0) { // no, move to the next registered autoloader return; }
// get the relative class name $relative_class = substr($class, $len); // replace the namespace prefix with the base directory, replace namespace // separators with directory separators in the relative class name, append // with .php $file = $base_dir . '/' . str_replace('\\', '/', $relative_class) . '.php';
// if the file exists, require it if (file_exists($file)) { require $file; } }); }
namespace App { $controller = new PostPostController(); }
Post/PostController.php:
PHP-Code:
<?php
namespace AppPost;
class PostController { }
Die Backspaces bei den Namespaces macht das Forum kaputt, die muss man sich dazu denken.
|

31-08-2020, 19:47
|
markusOk
Registrierter Benutzer
|
|
Registriert seit: Aug 2020
Beiträge: 3
|
|
Kompliziert oder einfach
Zitat:
Zitat von h3ll
Es wäre einfacher, wenn der Code nicht so unnötig in mehrere Dateien und Ordner verstreut wäre. Ich blick bei der Ordnerstruktur ehrlich gesagt nicht durch. Und das ist für den Problemfall ja komplett irrelevant, also warum muss man sich damit abmühen?
Es ist eigentlich deine Aufgabe ein simplifiziertes Beispiel zu erstellen, bei dem das Problem nachvollziehbar auftritt, als das andere sich in deine Anwendung hineindenken und verstehen müssen.
|
Ok das verstehe ich, die Ordnerstruktur wollte ich jedoch bewusst als Teil der Problemstellung belassen, weil ich eine Lösung mit dieser forcieren wollte, da das Projekt erst am Anfang steht und noch stark skaliert werden sollte ohne das die Ordnung darunter leidet. -> https://ibb.co/WKRkj8g
Danke für deinen Lösungscode, ich werde es mal so testen. Vielleicht kann ich es strukturell doch so machen wie von dir vorgeschlagen.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Thema bewerten |
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|