Using Require and then Use in a class - php

I am trying to create an excel file by invoking a class. This is a class that I have written and inside this class, I am trying to invoke the PHPOFFICE library that is already installed on my system. My code is as follows:
class createXls {
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
public function createXl($loginid, $report_index, $header, $data, $fname)
{
But I am unable to get this to work because clearly require cannot be placed outside the method. How do I go about doing this?

Related

Raw PHP vs Laravel Framework : 'include' file

I am going through basic concepts in Laravel and I have a conceptual question.
In Raw PHP:
When I want to create an object of a class (e.g User), that is in a different directory (e.g. app\user.php) with a namespace (e.g. namespace App), I have to include that file first (using include 'app/user.php') and then add the 'use' (use App\User).
<?php
include 'app/user.php'; // including the file
use App\User;
$user = new User('John');
However, in Laravel I have seen that they don't include any file at all. They just add the 'use' keyword (use App\User.php)and then can instantiate an object of it. ($user = User::find(1)).
<?php
namespace App\Http\Controllers;
use App\User;
class UserController extends Controller
{
public function index()
{
$user = User::find(1);
}
}
Can someone please explain how that happens?
This is not laravel feature this is autoload_class from php.
In https://www.php.net/manual/en/language.oop5.autoload.php
The spl_autoload_register() function registers any number of autoloaders, enabling for classes and interfaces to be automatically loaded if they are currently not defined. By registering autoloaders, PHP is given a last chance to load the class or interface before it fails with an error.
All classes exist in composer autoload file:
vendor/composer/autoload_classmap.php

Laravel use vendor directory php class

Recently I learn Laravel and try to implement BingAds SDK to grab some reports to my database but failed.
I have a controller named BingAdController.php in app/http/Controllers/BingAdController.php
BingAds SDK is installed via composer, they are in vendor/microsoft/bingads/samples/V12/ReportRequests.php
BingAdController.php
namespace App\Http\Controllers;
use SoapVar;
use SoapFault;
use Exception;
use SoapClient;
use Illuminate\Http\Request;
use App\BingAd;
use App\Http\Controllers\Controller;
use Microsoft\BingAds\V12\Reporting\ReportRequestStatusType;
use Microsoft\BingAds\Auth\ServiceClient;
use Microsoft\BingAds\Auth\ServiceClientType;
use Microsoft\BingAds\Samples\V12\AuthHelper;
use Microsoft\BingAds\Samples\V12\ReportRequestLibrary;
include("/Applications/MAMP/htdocs/laravel/vendor/microsoft/bingads/samples/V12/ReportRequests.php");
class BingAdController extends Controller {
public function bingadsReporting(){
ReportRequests.php
namespace Microsoft\BingAds\Samples\V12;
// require_once __DIR__ . "/vendor/autoload.php";
require_once "/Applications/MAMP/htdocs/laravel/vendor/autoload.php";
include __DIR__ . "/AuthHelper.php";
include __DIR__ . "/ReportRequestLibrary.php";
use SoapVar;
use SoapFault;
use Exception;
use Microsoft\BingAds\V12\Reporting\ReportRequestStatusType;
use Microsoft\BingAds\Auth\ServiceClient;
use Microsoft\BingAds\Auth\ServiceClientType;
use Microsoft\BingAds\Samples\V12\AuthHelper;
use Microsoft\BingAds\Samples\V12\ReportRequestLibrary;
$GLOBALS['AuthorizationData'] = null;
$GLOBALS['Proxy'] = null;
$GLOBALS['CampaignManagementProxy'] = null;
class ReportRequests {
public $DownloadPath, $length, $folder;
Laravel keep saying the class not found...
I have been stuck in this problem for 2 days... please help
You shouldn't be manually calling include or require_once in your code - Laravel uses Composer's autoloader out of the box, so you should just be able to refer to the classes you need and it will do the rest.
First, ensure that you have installed Bing's SDK through Composer - i.e. it's added in your composer.json and it was installed through the command line tool. If you just downloaded it yourself and dropped it in the vendor directory it's not going to work.
Then you should be able to call new Microsoft\BindAds\Auth\ServiceClient or whichever class you want - Composer will know where and how to find this class for you.
If you have installed it through Composer and are still having issues you'll need to provide the exact code you're having issues with as well as the full error and stacktrace you're seeing so that we can assist debugging it.
Finally I found the solution.
Add "vendor/microsoft/bingads" into vendor/composer.json -> classmap
Don't know why BingAds didn't auto update composer.json even via composer install.

Simple PHP namespace issue

Trying to implement a 3rd-party-lib with PHP 5.3.9-ZS5.6.0 and the lib uses namespaces. The code where I want to use the lib doesn't. So i have:
facebook.php
Mute
(Mute is the folder of the lib)
In facebook.php I try:
$app = new \Mute\Facebook\App();
Resulting in: Fatal error: Class 'Mute\Facebook\App' not found in...
The files are all in place.
I can say:
use \Mute\Facebook\App;
without getting any error/warning... What am I missing?
When I require the "App.php" via require_once I get the next error: Fatal error: Interface 'Mute\Facebook\Bases\AccessToken' not found in [...]/Mute/Facebook/App.php
Mute/Facebook/App.php:
<?php
namespace Mute\Facebook;
use Closure;
use Exception;
use Mute\Facebook\Bases\AccessToken;
use Mute\Facebook\Bases\Batchable;
use Mute\Facebook\Bases\Configurable;
use Mute\Facebook\Bases\Requestable;
use Mute\Facebook\Bases\RequestHandler;
use Mute\Facebook\Exception\CurlException;
use Mute\Facebook\Exception\GraphAPIException;
use Mute\Facebook\Exception\HTTPException;
use Mute\Facebook\Exception\InvalidArgumentException;
use Mute\Facebook\Exception\OAuthSignatureException;
use Mute\Facebook\Util;
class App implements AccessToken, Batchable, Configurable, Requestable, RequestHandler
{ [...]
function __autoload($class_name) {
require_once str_replace('\\', '/', $class_name) . '.php';
}
I created a __autoload function to "magically" require all files I need. Totally forgot about this method >.<

PHP Symfony- How to inherit multiple classes from one php file

I am using Symfony 2.4
I have a PHP file OAuth.php which has multiple classes inside that.
Code of OAuth.php is as below
<?php
namespace RT\AuthBundle\DependencyInjection\Vzaar;
use Exception;
class OAuthException extends Exception {
// pass
}
class OAuthConsumer {
//some code
}
class OAuthToken {
//some code
}
?>
I am inheriting above file in Vzaar.php file which is with in same namespace and it's code is as below
<?php
namespace RT\AuthBundle\DependencyInjection\Vzaar;
/*require_once 'OAuth.php';
require_once 'HttpRequest.php';
require_once 'AccountType.php';
require_once 'User.php';
require_once 'VideoDetails.php';
require_once 'VideoList.php';
require_once 'UploadSignature.php';*/
use RT\AuthBundle\DependencyInjection\Vzaar\OAuth;
use RT\AuthBundle\DependencyInjection\Vzaar\HttpRequest;
use RT\AuthBundle\DependencyInjection\Vzaar\AccountType;
use RT\AuthBundle\DependencyInjection\Vzaar\User;
use RT\AuthBundle\DependencyInjection\Vzaar\VideoDetails;
use RT\AuthBundle\DependencyInjection\Vzaar\VideoList;
use RT\AuthBundle\DependencyInjection\Vzaar\UploadSignature;
//use RT\AuthBundle\DependencyInjection\Vzaar\OAuth\OAuthConsumer;
Class Profile
{
public static function setAuth($_url, $_method = 'GET')
{
$consumer = new OAuthConsumer('', '');
//some code
}
}
?>
Creating new object of OAuthConsumer class throws error that
Fatal error: Class 'RT\AuthBundle\DependencyInjection\Vzaar\OAuthConsumer' not found in /var/temp/rt-web/src/RT/AuthBundle/DependencyInjection/Vzaar/Vzaar.php
1/1 ClassNotFoundException: Attempted to load class "OAuthConsumer" from namespace "RT\AuthBundle\DependencyInjection\Vzaar" in /var/temp/rt-web/src/RT/AuthBundle/DependencyInjection/Vzaar/Vzaar.php line 378. Do you need to "use" it from another namespace?
Because since 2.1 Symfony uses composer, and composer uses PSR-0/PSR-4 to autoloading the classes, you have to follow the namespace convention, so you have to create those classes in separate files and in the right directory structure, what is represented in the namespace.
EDIT
As Cerad mentioned in the comment, you can specify a class map in composer, although what is considered as a best practice with symfony projects, create every class in a separate file.

Access 3rd parties codes when using namespace PhP 5.5

I am developing with php 5.5, I provided code of my file here
<?php
require_once 'jsonrpcphp/includes/jsonRPCClient.php';
class Client
{
private $remoteMain;
public function __construct($param)
{
$this->remoteMain = new jsonRPCClient('http://
urlTofile/nameOfFile.php');
This codes works absolutely fine but the issue comes when I need to put a namespace for the file as soon as I put a namespace at the top of the file, for example:
<?php
namespace packagename\subPackage;
require_once 'jsonrpcphp/includes/jsonRPCClient.php';
class Client
This error will be displayed
Class 'packagename\subPackage\jsonRPCClient' not found in
The question is this:
how to access a class which is not in my namespace and provided from 3rd parties when I need to have namespaces
thanks in advance
If you're in namespace packagename\subPackage, then new jsonRPCClient refers to the class packagename\subPackage\jsonRPCClient. If you want to use a class from the global namespace, you need to explicitly specify that:
new \jsonRPCClient
Alternatively, explicitly alias the class at the top of the file:
use jsonRPCClient;
new jsonRPCClient(...)
Please RTM: http://php.net/manual/en/language.namespaces.basics.php

Categories