21
Sat, Dec
3 New Articles

New Zend ToolKit: Part 1

Web Languages
Typography
  • Smaller Small Medium Big Bigger
  • Default Helvetica Segoe Georgia Times

Forget about the old Zend Toolkit! Let's start using the new one.

 

In my last column, I outlined how to call PHP and RPG programs from each other. I used as the basis for this the old i5 Toolkit from Easycom that was part of the Zend product prior to release 5.6, because I figured a lot of people still have that. But I sort of promised that next time I would do the same thing using the new, true Zend Toolkit. Well, it's next time.

The big difference is that while the old toolkit was procedural and pretty understandable, the new Zend Toolkit is object-oriented, so it may not be quite as understandable to most of us at first glance, but I think you will see that it all makes sense eventually. I will just say that the first time you really look at OO code it can be a shock, and the most common thing that happens is people shut down and go on to something else, but I ask you not to do that. Once you get over the initial shock, I think you will be able to learn some really useful things and start your journey to the OO side. To minimize the shock, I will take the PHP code to use the new Zend Toolkit one statement at a time.

If you want more information on this topic (PHP and the i and the new toolkit) you should visit www.alanseiden.com. Alan is an acknowledged expert (at least IBM thinks he is) in these areas and his Web site features some very good articles and references. He also appears to be one of the least annoying people I have ever not met but communicated with.

Grabbing the Toolkit

OK, let's get started. To call an RPG program from a PHP script using the new Zend OO Toolkit, the first thing you have to do is bring in the Toolkit. There are two ways in PHP to do a /Copythat is, to bring in a section of code and include it in the script. In the PHP world, we generally don't use the word "source" the same way we do with RPG, because with PHP everything is "source; there is no object since it is not compiled. But often you want to include some extra code without having to actually key it in, just as you do in RPG with a /Copy.

To do this, you can use either the include or the require commands. And for each of these, you have either the straight command or the _once option. What's the difference? Thank you very much for asking.

If you try to include code that cannot be found when the script is executed, the include will issue a warning. Consequently, you use the include for stuff that is no big deal if the code can't be found and it doesn't run. Require on the other hand comes right back with a fatal error if the code can't be found and so is used if you absolutely, positively have to have the module run for things to be OK. You know: it's good cop, bad cop.

In addition, as I said, each of these commands comes in two flavors; straight up (include and require) and the "once" version of each (include_once and require_once). The "once" option will load the code only once, even if you specify the command multiple times. This does become important at times, even if just from a performance point of view. What kinds of things would you include (or require)? In our case, it will be code that performs specialized functions, but it could also be class or function definitions. As you may know, OO is very modular, much more so than RPG tends to be (although that's our fault, not theirs), so the ability to pull code or classes or whatnot into a script is very important.

An important thing to note is that when you do the include or require, the code that they pull in will pick up (inherit) any variables that are in the scope at that point. We haven't talked about "inheritance" within OO, but I think you get the basic idea.

So, to summarize, our starting point will be to pull in the toolkit script, using the require_once option because it is important that this code be found, and it would be silly to bring it in multiple times when one will do.

require_once 'ToolkitService.php';

Note the facts that the name of the script, including its extension, is in single quotes and that the whole command ends with a semicolon, which is standard PHP syntax.

And, if you're a real stickler, you know that the above is not a complete path. The rest of the link to ToolkitService.php is actually contained in the include_path setting in the php.ini file (which is a control file in every PHP installation to help you customize how your installation will work).

Define $conn Variable

OK, how is everybody feeling? Everyone still got their paper bag? Anyone's bag full? Great. Just remember, head between the knees.

The next thing we'll do is define a variable. Now the one thing you want to get drilled into that thick skull of yours (no offense intended) is that every time you see a character string prefixed by a $, you know it's a variable. You may be tempted to think it's some sort of function or other thing that does something, but it's only a variable, so there's no sense getting scared.

In the RPG world, we tend to think of variables as carrying data: either some form of numeric or else character. But in PHP, variables can carry a lot more than just data. In this case, we'll set the variable equal to an object that is accessed using a function from the toolkit.

What's important to remember is that while in RPG a variable contains data (either some form of numeric or else character), in PHP we have a lot more flexibility (or power) in terms of what a variable can contain. In this case, we'll be defining a variable that will contain an object. In particular, it will carry an object that we pick up from the toolkit.

To make this easier, I'm going to list the code statements first, and explain each second.

$conn = ToolkitService::getInstance('*LOCAL', 'MYUSER', 'MYPASS');?

$conn->setToolkitServiceParams(array('stateless'=>true));?

Yeah, I know. For a procedural programmer, it looks pretty weird. But you are not just an RPG programmer. You are a code warrior. Attaaaaccccckkkkkk!!!!!!!

First Statement

For starters, $conn is the variable name. No particular reason for this name, but that's what I chose. You could just as easily have used $whatever or $dave.  

The next thing is the class name that we're going to play with: ToolkitService. A class is a collection of objects. You might look at the class sort of the way we do a file, with the objects being the records in the file. You shouldn't do that, because it's a ridiculous simplification, but if you have to do that, whatever.

In most cases, when you define a class, it's defined as "non-static." That is, there can be multiple instances (read: occurrences) of this class in your script, and each one can have different values. That's the way most classes are defined. In this case, however, the ToolkitService class was defined (by Zend when they built the class) as "static." This means a couple of things. First, it means that if there are two instances (occurrences) of this class in a script, they will both have the same values. Second, it means that if you change the value in one instance, the value in the other instance will also be changed. In essence, there can't really be multiple instances.

The cool kids call this type of class an example of the Singleton Design Pattern. That's another thing that's nice about OO and pretty much missing from procedural languages. There are various types of design patterns, and their use helps standardized scripts across different programmers. The Singleton Design Pattern is a bit controversial, and some people don't like it at all, but much of it is a matter of taste. And that's all I'm going to say about it.

OK. At this point, we're defining a variable, $conn, as the object from static class ToolkitService using the getinstance() method (function) to bring in the three values we need.

You might be wondering about the double colon. That's one thing about PHP that can be (is) confusing: the number of oddball operators that they use. In some cases, choosing the right operator is crucial to getting something to work. In other cases (like with the :: ), it's partially a matter of good form.

Technically, the double colon indicates that you're accessing static functions or variables (in our case, we're accessing variables) in a class (that would be the ToolkitService class).

The -> symbol is what you use to refer to a specific instance within a non-static class. You can also use it to access the static variables, but the other PHP kids will make fun of you and beat you up after school, so I wouldn't.

Second Statement

There, see how simple that was? Now on to the second statement.

$conn->setToolkitServiceParams(array('stateless'=>true));?

We recognize the $conn variable. And we know that the -> means I am going to be working with a variable, this time one that's part of the ToolkitServiceParams class. And a little imagination tells us that we're going to be picking up the "stateless" parm in an array in this class and setting it to "true." The stateless parm is something that I'm not going to go into right now, but it basically determines whether this function occurs within this job or whether a second one is set up. If you don't want to go stateless, then you need to set an internal key value as below.

$conn->setToolkitServiceParams(array('InternalKey'=>'/tmp/myusername'));

You know what you should be wondering about right now? I said above that the double colon (::) is what you should use when you're dealing with a static class like ToolkitService. But in the second statement, we're using the ->, which I have already said is legal but a good way to get beaten up. And the difference is that in the first statement we're talking about the class and so use :: to show that class is static. But when we're talking about a property of a static class, then it's already static by definition and we can use the -> to refer to it. Small point but it helps it make sense.

And Then?

Merciful heavens. I'm exhausted. Are we done? Dude, we've covered three statements! No, we're not done, but we've also covered some important things in PHP and OO. Look forward to the next exciting episode, where we finish looking at how to call an RPG program from a PHP script using the new Toolkit.

And try not to look so gloomy. In total, there are probably fewer code lines in this approach than in the one for the old toolkit. It's just that we need more explanation because it looks so freaky weird. Here's what we have so far.

require_once 'ToolkitService.php';

 

$conn = ToolkitService::getInstance('*LOCAL', 'MYUSER', 'MYPASS');

$conn->setToolkitServiceParams(array('stateless'=>true));

Does it look a little more familiar now? Hope so. For the rest, see you next column.

BLOG COMMENTS POWERED BY DISQUS

LATEST COMMENTS

Support MC Press Online

$

Book Reviews

Resource Center

  • SB Profound WC 5536 Have you been wondering about Node.js? Our free Node.js Webinar Series takes you from total beginner to creating a fully-functional IBM i Node.js business application. You can find Part 1 here. In Part 2 of our free Node.js Webinar Series, Brian May teaches you the different tooling options available for writing code, debugging, and using Git for version control. Brian will briefly discuss the different tools available, and demonstrate his preferred setup for Node development on IBM i or any platform. Attend this webinar to learn:

  • SB Profound WP 5539More than ever, there is a demand for IT to deliver innovation. Your IBM i has been an essential part of your business operations for years. However, your organization may struggle to maintain the current system and implement new projects. The thousands of customers we've worked with and surveyed state that expectations regarding the digital footprint and vision of the company are not aligned with the current IT environment.

  • SB HelpSystems ROBOT Generic IBM announced the E1080 servers using the latest Power10 processor in September 2021. The most powerful processor from IBM to date, Power10 is designed to handle the demands of doing business in today’s high-tech atmosphere, including running cloud applications, supporting big data, and managing AI workloads. But what does Power10 mean for your data center? In this recorded webinar, IBMers Dan Sundt and Dylan Boday join IBM Power Champion Tom Huntington for a discussion on why Power10 technology is the right strategic investment if you run IBM i, AIX, or Linux. In this action-packed hour, Tom will share trends from the IBM i and AIX user communities while Dan and Dylan dive into the tech specs for key hardware, including:

  • Magic MarkTRY the one package that solves all your document design and printing challenges on all your platforms. Produce bar code labels, electronic forms, ad hoc reports, and RFID tags – without programming! MarkMagic is the only document design and print solution that combines report writing, WYSIWYG label and forms design, and conditional printing in one integrated product. Make sure your data survives when catastrophe hits. Request your trial now!  Request Now.

  • SB HelpSystems ROBOT GenericForms of ransomware has been around for over 30 years, and with more and more organizations suffering attacks each year, it continues to endure. What has made ransomware such a durable threat and what is the best way to combat it? In order to prevent ransomware, organizations must first understand how it works.

  • SB HelpSystems ROBOT GenericIT security is a top priority for businesses around the world, but most IBM i pros don’t know where to begin—and most cybersecurity experts don’t know IBM i. In this session, Robin Tatam explores the business impact of lax IBM i security, the top vulnerabilities putting IBM i at risk, and the steps you can take to protect your organization. If you’re looking to avoid unexpected downtime or corrupted data, you don’t want to miss this session.

  • SB HelpSystems ROBOT GenericCan you trust all of your users all of the time? A typical end user receives 16 malicious emails each month, but only 17 percent of these phishing campaigns are reported to IT. Once an attack is underway, most organizations won’t discover the breach until six months later. A staggering amount of damage can occur in that time. Despite these risks, 93 percent of organizations are leaving their IBM i systems vulnerable to cybercrime. In this on-demand webinar, IBM i security experts Robin Tatam and Sandi Moore will reveal:

  • FORTRA Disaster protection is vital to every business. Yet, it often consists of patched together procedures that are prone to error. From automatic backups to data encryption to media management, Robot automates the routine (yet often complex) tasks of iSeries backup and recovery, saving you time and money and making the process safer and more reliable. Automate your backups with the Robot Backup and Recovery Solution. Key features include:

  • FORTRAManaging messages on your IBM i can be more than a full-time job if you have to do it manually. Messages need a response and resources must be monitored—often over multiple systems and across platforms. How can you be sure you won’t miss important system events? Automate your message center with the Robot Message Management Solution. Key features include:

  • FORTRAThe thought of printing, distributing, and storing iSeries reports manually may reduce you to tears. Paper and labor costs associated with report generation can spiral out of control. Mountains of paper threaten to swamp your files. Robot automates report bursting, distribution, bundling, and archiving, and offers secure, selective online report viewing. Manage your reports with the Robot Report Management Solution. Key features include:

  • FORTRAFor over 30 years, Robot has been a leader in systems management for IBM i. With batch job creation and scheduling at its core, the Robot Job Scheduling Solution reduces the opportunity for human error and helps you maintain service levels, automating even the biggest, most complex runbooks. Manage your job schedule with the Robot Job Scheduling Solution. Key features include:

  • LANSA Business users want new applications now. Market and regulatory pressures require faster application updates and delivery into production. Your IBM i developers may be approaching retirement, and you see no sure way to fill their positions with experienced developers. In addition, you may be caught between maintaining your existing applications and the uncertainty of moving to something new.

  • LANSAWhen it comes to creating your business applications, there are hundreds of coding platforms and programming languages to choose from. These options range from very complex traditional programming languages to Low-Code platforms where sometimes no traditional coding experience is needed. Download our whitepaper, The Power of Writing Code in a Low-Code Solution, and:

  • LANSASupply Chain is becoming increasingly complex and unpredictable. From raw materials for manufacturing to food supply chains, the journey from source to production to delivery to consumers is marred with inefficiencies, manual processes, shortages, recalls, counterfeits, and scandals. In this webinar, we discuss how:

  • The MC Resource Centers bring you the widest selection of white papers, trial software, and on-demand webcasts for you to choose from. >> Review the list of White Papers, Trial Software or On-Demand Webcast at the MC Press Resource Center. >> Add the items to yru Cart and complet he checkout process and submit

  • Profound Logic Have you been wondering about Node.js? Our free Node.js Webinar Series takes you from total beginner to creating a fully-functional IBM i Node.js business application.

  • SB Profound WC 5536Join us for this hour-long webcast that will explore:

  • Fortra IT managers hoping to find new IBM i talent are discovering that the pool of experienced RPG programmers and operators or administrators with intimate knowledge of the operating system and the applications that run on it is small. This begs the question: How will you manage the platform that supports such a big part of your business? This guide offers strategies and software suggestions to help you plan IT staffing and resources and smooth the transition after your AS/400 talent retires. Read on to learn: