Constructor/Destructor

Constructor

The constructor syntax in THP is inspired by Kotlin.

Constructors are declared like function definitions:


//          |this is the constructor |
  ╰╴No statement matched
class Animal(String fullname, Int age) // Creating an instance val cat = Animal("Michi", 3)
thp

A constructor declared that way is public.

Note that the parameters in the constructor (fullname, age above) are not properties, and cannot be used inside the class methods, only in the init block and properties declaration.

To declare properties in the constructor see Constructor promotion.

Constructor visibility

If you want to declare a constructor as protected or private you need to add the constructor keyword, after the visibility modifier:


// Cow has a protected constructor
  ╰╴No statement matched
class Cow protected constructor(String color) // Bat has a private constructor class Bat private constructor(Int height)
thp

Init block

The init block allow us to run code during the construction of the instance:


class Dog(String name) {
╰╴No statement matched
pub String name = name Int name_len = name.length init { print("Dog created: {name}") } }
thp

This would be equilavent to the following PHP code:

class Dog {
    public string $name;
    private int $name_len;

    public function __construct(string $name) {
        $this->name = $name;
        $this->name_len = size($name);
        print("Dog created: $name");
    }
}

Constructor promotion

Constructor parameters can serve as class properties. This is done by adding a modifier and var/val.


class Parrot(
╰╴No statement matched
// A public property pub val String name, // A protected property protected var Int age, // A private property var String last_name, )
thp

By using this syntax you are declaring properties and assigning them at the same time.

The contructor parameters can also have default values.

Derived properties

You can declare properties whose values depend on values on the constructor.


class Animal(
╰╴No statement matched
val String fullname, ) { // A property whose value depends on `fullname` // This is executed after the contructor pub val Int name_length = fullname.length } val a2 = Animal("Doa") print(a2.name_length) //: 3
thp

Constructor that may fail

A constructor may only fail if there is code that can fail on the init block.

TBD

Proposal 1:


class PrayingMantis(String name)
╰╴No statement matched
throws Error { init -> Error! { // Initialization code that may fail } }
thp

Destructor

The destructor in THP is the same as PHP.


class Owl() {
╰╴No statement matched
pub fun __destruct() { // Cleanup print("Destroying Owl...") } }
thp